2014-11-17 3 views
1

Я не уверен, что лучший способ написать название для этого вопроса, так извините за несколько плохой титул. Вместо этого я просто напишу пример.Сортировка списка формы [(одно значение), [(кортеж 1), (tuple2), ...], (другое значение), [...]]

Что я хочу сделать, это взять элементы из словаря и поместить их в список (который я сделал со следующим кодом).

for key,val in teamDict.items(): teamlist.append((key,val)) 

Теперь этот список содержит информацию о командах в НФЛ, и хранится в виде:

[('DAL', [(2011, 'Chauncey Washington', 47.29080932784636, 1, -1, 0, 0), (2011, 'DeMarco Murray', 90.58014654220617, 164, 897, 2, 1)...]] 

И так далее, с каждой команды представлены. Теперь то, что я хочу, это выход, чтобы выглядеть примерно так

Roy Helu     2011  81.33 
Ryan Torain    2011  78.16 
Tim Hightower    2011  84.20 
Andre Brown    2010  50.03 
Brandon Banks    2010  69.24 
Clinton Portis    2010 108.35 

Только для каждого игрока с 2011 года, которые будут напечатаны после того, как каждый игрок с 2010 года было напечатано. Все правильно отформатировано и правильно распечатывается, единственная проблема, с которой я сталкиваюсь, - это не возможность правильно сортировать годы. Также здесь есть код, который сортирует список:

for item in teamlist: 
    for sub_item in item: 
     teamName = item[0] 
    if user_input == teamName: 
     for sub_sub_item in sub_item: 
      print(" {:<25} {:^6} {:>8.2f}".format(sub_sub_item[1], sub_sub_item[0], sub_sub_item[2])) 

Я знаю о возможности ключа = operator.itemgetter(), но я не уверен, что если бы даже работать в список, как это или где поместите его в мои петли.

Любые подсказки, чтобы указать мне в правильном направлении, будут очень признательны.

+0

Для включения пар ключ-значение из словаря в список кортежей, сделать 'my_dict. пункты() '. Если вы находитесь на Python 3, тогда выполните 'list (my_dict.items())'. –

+0

Просто чтобы быть понятным, мы печатаем только одну команду за раз? –

ответ

0

вы можете попробовать это:

for item in teamlist: 
    for sub_item in item: 
     teamName = item[0] 
    if user_input == teamName: 
     sorted_lists = [x for x in zip(*sorted(zip(sub_item), key=lambda x: x[0]))] 
     for sub_sub_item in sorted_lists[0]: 
      print(" {:<25} {:^6} {:>8.2f}".format(sub_sub_item[1], sub_sub_item[0], sub_sub_item[2])) 

Если вы не большой поклонник лямбда, то вы можете использовать метод itemgetter оператора, который, как:

sorted_lists = [x for x in zip(*sorted(zip(sub_item), key=operator.itemgetter(0)))] 
0

Я не совсем уверен, что вы хотите отсортировать, но посмотрите на документацию, то есть https://wiki.python.org/moin/HowTo/Sorting.

Вы можете поставить функцию сортировки, чтобы определить ключ для сортировки, так, чтобы отсортировать [(2011, 'Chauncey Washington', 47.29080932784636, 1, -1, 0, 0), (2011, 'DeMarco Murray', 90.58014654220617, 164, 897, 2, 1)...] по годам вы могли бы назвать

from operator import itemgetter 
... 
sorted(yourList, key=itemgetter(0)) 

или с лямбда

sorted(yourList, key= lambda item: item[0]) 

Для более сложных сортировки смотрите в разделе Sort Stability and Complex Sorts по ссылке выше. В основном вы начинаете сортировку по наименее важным клавишам, а затем делаете стабильные сортировки для более важных ключей сортировки, пока не достигнете самого важного.

0

Похоже, что элементы внутри каждый внутренний кортеж уже в правильном порядке для сортировки (то есть, наиболее значимый элемент первого), поэтому проще всего сортировать их, как вы строите teamlist:

for key, val in teamDict.items(): 
    teamlist.append((key, sorted(val))) 

Это достаточно простой цикла, который вы могли бы сделать список понимание, если вам нравится:

teamlist = [(key, sorted(val)) for key, val in teamDict.items()] 
+0

Существует небольшая проблема в том, что вывод кажется отсортированным по убыванию года и восходящему имени. – Dunes

+0

@ Dunes: Я не знаю, как вы получаете этот результат. Когда я пытаюсь выполнить свое решение на тестовых данных, которые выглядят как OP, он появляется в возрастающем году и в течение определенного года в восходящем имени игрока. –

+0

Извините, я должен был быть яснее. Я имел в виду образец, указанный в вопросе. Ваш код сортируется по возрастанию для всех значений в кортеже. Увидев, что это похоже на задание на домашнюю работу, я считаю, что разница в нисходящем году и восходящем имени преднамеренно. – Dunes

Смежные вопросы