根据列表中的第一个值对列表字典进行排序

Sorting dictionary of lists based on first value in list

我需要 return 基于每个列表中的第一个数字降序排列的列表字典,例如:

{'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 个数字的列表,我不确定如何访问第一个数字并按第一个数字排序。 .

我正在使用 Python 2.7。任何帮助将不胜感激!谢谢!

你快到了!

collections.OrderedDict(sorted(a.iteritems(), key=lambda (k,v):v[0], reverse=True))
                                                               ^^^^

当使用 key= 参数调用 sorted(..) 时,第一个参数的每个元素都会传递给 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)的说法是有区别的。在后一种情况下,您将传递一个元组进行比较。它可能不会做你想要的。阅读元组比较的工作原理。

而不是 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])])

您是否测试过您已经拥有的东西是否仍然有效?因为它确实如此。当您对一组序列进行排序时,会比较它们 "alphabetically" - 如果两个序列的第一项相等,则比较它们的第二项,依此类推。这意味着,在您的示例中,sorted 将比较值 list 的第一个元素。如果它们不同,则排序顺序与您仅将第一个元素与 v[0] 进行比较时的排序顺序完全相同。如果它们相同,按 v[0] 排序只会确保这些元素的任意顺序。将其保留为 (v,k) 可确保如果值 list 的第一个元素相等,则它会根据其余元素进行排序。如果有两个 lists 相同的值,它根据键排序。

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