2012-01-01 3 views
1

У меня есть словарь со следующей структурой:словаря с несколькими значениями вложенного Списка

{'ONE' : (4, 6, 9), 'TWO' : (3, 8, 10)} 

я хотел бы отсортировать этот словарь по 3 значению каждого кортежа. Я не могу придумать способ, чтобы выполнить это с установкой данных в качестве словаря, но это должно быть довольно легко, если я могу преобразовать данные в вложенный список, как в следующем:

[['ONE', 4, 6, 9], ['TWO', 3, 8, 10]] 

Я нахожусь ищет наиболее эффективный код для этого. Если есть способ отсортировать этот словарь без его преобразования, это будет идеально. Если нет, любая помощь в переходе от словаря к вложенному списку была бы весьма признательна. Благодарю.

+1

Нет описания порядка для словарей, поэтому вы не можете сортировать их. Вам нужно сделать это косвенным образом, например, тот, который вы предлагаете. –

+0

На самом деле, python 2.7 имеет [OrderedDict class] (http://docs.python.org/library/collections.html#ordereddict-objects) – Alexandre

+0

Но они помнят только порядок, в котором введены ключи. Вам все еще нужен какой-то трюк для сортировки данных (и создания нового 'OrderedDict' в этом процессе) –

ответ

3

Используйте key аргумент встроенного sorted функция:

>>> d = {'ONE' : (4, 6, 9), 'TWO' : (3, 8, 10), 'FOUR': (2, 5, 8)} 
>>> sorted(d.iteritems(), key=lambda i: i[1][2]) 
[('FOUR', (2, 5, 8)), ('ONE', (4, 6, 9)), ('TWO', (3, 8, 10))] 

EDIT

Если некоторые значения являются Интс, а не кортежи, то что-то, как это должно работать:

>>> d = {'ONE' : (4, 6, 9), 'TWO' : (3, 8, 10), 'FOUR': (2, 5, 8), 'THREE': 0} 
>>> sorted(d.iteritems(), 
...  key=lambda i: i[1][2] if isinstance(i[1], tuple) else i[1]) 
[('THREE', 0), ('FOUR', (2, 5, 8)), ('ONE', (4, 6, 9)), ('TWO', (3, 8, 10))] 

Однако, в конечном счете, это, вероятно, лучше, чтобы нормализовать данные так что все значения имеют одинаковый формат.

+0

Вы, ребята, все фантастические.Это здорово, хотя все предложения были очень полезными, я думаю, что это самый простой способ (после того, как я удалю ints) – donopj2

+0

@PatrickD. Я обновил свой ответ с версией, которая справляется с ints. – ekhumoro

0
nestedlist = [[key] + list(value) for key,value in dictionary.items() if value != 0] 
+0

Я получаю ошибку« int », которая не является итерируемой. Мой фактический словарь довольно массивный, со строкой в ​​качестве ключа и тремя поплавками в кортеже для каждого значения. Фактический пример: «РЕСПУБЛИКА БРАЗИЛИЯ»: (0.013454, 0.005123, 0.008417369999) – donopj2

+1

@PatrickD, возможно ли, что одно из ваших значений в вашем словаре не является кортежем, а int? Это объясняет полученную вами ошибку. –

+0

Похоже, что @RobWouters говорит, да. –

0

Вот один из способов:

result = [] 
for key, value in dictionary.items(): 
    result.append([key] + list(value)) 

Если некоторые из ваших ценностей типа int вместо кортежей попробовать это:

result = [] 
for key, value in dictionary.items(): 
    try: 
     lst = list(value) 
    except TypeError: 
     lst = [value] 
    result.append([key] + lst) 
+0

Блестящий! Большое спасибо – donopj2

+0

Это дает ему список, который содержит нерегулярные элементы. Имея это, он намеревается сортировать по 3-му значению из каждого кортежа ... это не сработает при переводе словаря в список, но позже при сортировке. –

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