2015-06-06 3 views
2

Я хотел бы отсортировать словарь на основе второго значения кортежа и получить верхние элементы k.
Приведенный ниже код работает, если для каждой клавиши есть одно значение. Как изменить его с помощью кортежей или списков или массивов numpy?Сортировка словаря с значениями кортежа и элементами верхнего фильтра k

A = {'a':(3, 4), 'b':(1, 2), 'c': (10,11)} 
newA = dict(sorted(A.iteritems(), key=operator.itemgetter(1), reverse=True)[:k]) 

желаемый результат:

'b' 
'a' 
'c' 

ответ

1

Не забывайте, что dicts не стабильны - их порядок может и будет меняться, в результате чего катастрофично если вы меньше всего этого ожидаете, потому что это происходит чаще всего при вставке ключей. Поэтому используйте OrderedDict из сборников

In [1]: from collections import OrderedDict 
In [2]: OrderedDict(sorted(A.iteritems(), key=operator.itemgetter(1), reverse=False)[:k]) 
Out[2]: OrderedDict([('b', (1, 2)), ('a', (3, 4)), ('c', (10, 11))]) 
1
newA = dict(sorted(A.iteritems(), key=lambda i: i[1][1], reverse=True)[:k]) 
1

Проверьте это:

In [1]: A = {'a':(3, 4), 'b':(1, 2), 'c': (10,11)} 

In [2]: B = A.items() 

In [3]: B.sort(key=lambda x:x[1][1]) 

In [4]: B 
Out[4]: [('b', (1, 2)), ('a', (3, 4)), ('c', (10, 11))] 

In [5]: print "\n".join([x[0] for x in B]) #expected output 
b 
a 
c 
+0

Это то же самое, что и @Amber? – wwii

+1

Какова шкала времени с увеличенными клавишами или значениями с большим количеством элементов? – wwii

+1

@wwii, ответ Амбера дает вам диктовку. мне кажется нехорошо использовать dict, если порядок важен. –