我需要根据每个列表中的第一个数字以降序返回列表字典,例如:
{'key1': [2, 3], 'key2': [7, 7], 'key3': [5, 10]}
should return: {'key2': [7, 7], 'key3': [5, 10], 'key1': [2, 3]}
我原来的是:
orderedDict = collections.OrderedDict(sorted(dict.iteritems(), key=lambda (k,v):(v,k), reverse=True))
当字典的值只是数字时,但是现在我已经将字典的值更改为包含2个数字的列表,我不知道如何访问和排序第一个数字.. < / p>
我正在使用Python 2.7。任何帮助将不胜感激!谢谢!
答案 0 :(得分:2)
你快到了!
collections.OrderedDict(sorted(a.iteritems(), key=lambda (k,v):v[0], reverse=True))
^^^^
当使用sorted(..)
参数调用key=
时,第一个参数的每个元素都会传递给lambda。在您的情况下,k
将是一个键(例如:"key1"
),v
将是一个值(例如:[7,7]
)。您需要说的是:v[0]
>>> collections.OrderedDict(sorted(a.iteritems(), key=lambda (k,v):v[0], reverse=True))
OrderedDict([('key2', [7, 7]), ('key3', [5, 10]), ('key1', [2, 3])])
注意:说出v[0]
和(v[0],k)
之间存在差异。在后一种情况下,您传递一个元组进行比较。它可能不会做你想要的。阅读元组比较的工作原理。
答案 1 :(得分:0)
而不是v
,您只需提及v[0]
,即您要排序的值的索引。
>>> orderedDict = collections.OrderedDict(sorted(my_dict.iteritems(), key=lambda (k,v):v[0], reverse=True))
>>> orderedDict
OrderedDict([('key2', [7, 7]), ('key3', [5, 10]), ('key1', [2, 3])])
添加一条信息,您可以在通话中移除reversed=True
参数,并将v[0]
替换为-v[0]
。结果将是相同的:
>>> orderedDict = collections.OrderedDict(sorted(my_dict.iteritems(), key=lambda (k,v):-v[0]))
>>> orderedDict
OrderedDict([('key2', [7, 7]), ('key3', [5, 10]), ('key1', [2, 3])])
答案 2 :(得分:0)
您是否测试过您已经看过它是否仍然有效?因为它确实如此。当您对一组序列进行排序时,它们将按字母顺序进行比较 - 如果两个序列的第一项相等,则比较它们的第二项,依此类推。这意味着,在您的示例中,sorted
会比较值list
的第一个元素。如果它们不同,则排序顺序与您仅将第一个元素与v[0]
进行比较时的排序顺序完全相同。如果它们相同,按v[0]
排序只会确保这些元素的任意顺序。将其保留为(v,k)
可确保如果值list
的第一个元素相等,则会根据其余元素进行排序。如果有两个值相同list
的值,则会根据键进行排序。
>>> import collections
>>> d = {'key1': [2, 3], 'key2': [7, 7], 'key3': [5, 10]}
>>> orderedDict = collections.OrderedDict(sorted(d.iteritems(), key=lambda (k,v):(v,k), reverse=True))
>>> orderedDict
OrderedDict([('key2', [7, 7]), ('key3', [5, 10]), ('key1', [2, 3])])