Python将已排序的字典转换为列表?

时间:2012-10-07 22:48:05

标签: python list dictionary

我有两个列表

L1 = ['tom', 'jerry', 'spike', 'fido', 'donald', 'mickey']
L2 = [3,5,7,6,9,3]
dictionary = dict(zip(L1, L2))
print dictionary

sorted_friends = sorted(dictionary.iteritems(), key = operator.itemgetter(1), reverse= True)
print sorted_friends

基本上,我正在创建L1和L2的字典。      {'mickey': 3, 'tom': 3, 'jerry': 5, 'donald': 9, 'fido': 6, 'spike': 7} 按值排序(反向)排序,这给了我:[('donald', 9), ('spike', 7), ('fido', 6), ('jerry', 5), ('mickey', 3), ('tom', 3)]

我想要一个前3个键的列表:例如[donald,spike,fido] 但问题是,如果我使用任何我知道的方法,如dict()等,它会破坏排序。

2 个答案:

答案 0 :(得分:5)

无需使用词典;只需创建元组列表并按适当的字段对它们进行排序。

sorted(zip(L1, L2), key=lambda x: x[1], reverse=True)[:3]

您可以随意使用operator.itemgetter(1)代替lambda。

如果你只是想要事后的名字,你可以修改它:

[a for a,_ in sorted(zip(L1, L2), key=lambda x: x[1], reverse=True)][:3]

请注意,您也可以通过简单地颠倒顺序来方便地避免指定自定义排序功能:

[b for _,b in sorted(zip(L2, L1), reverse=True)][:3]

这是有效的,因为元组的默认排序顺序是根据它们的第一个元素,然后是第二个元素对它们进行排序,依此类推 - 所以它将首先按值排序。

答案 1 :(得分:1)

如果您只想要3个最大的,为什么不使用heapq

>>> L1 = ['tom', 'jerry', 'spike', 'fido', 'donald', 'mickey']
>>> L2 = [3,5,7,6,9,3]
>>> dictionary = dict(zip(L1, L2))
>>> import heapq
>>> heapq.nlargest(3, dictionary, key=dictionary.get)
['donald', 'spike', 'fido']

这也有可能,但跳过创建字典有点棘手

>>> heapq.nlargest(3, L1, key=lambda x, i2=iter(L2): next(i2))
['donald', 'spike', 'fido']