基于列表

时间:2016-08-25 23:53:33

标签: python list sorting dictionary ordereddictionary

我需要根据每个列表中的第一个数字以降序返回列表字典,例如:

{'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。任何帮助将不胜感激!谢谢!

3 个答案:

答案 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])])