【问题标题】:Sorting dictionary of lists based on first value in list根据列表中的第一个值对列表字典进行排序
【发布时间】:2017-01-02 13:02:55
【问题描述】:

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

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

【问题讨论】:

  • 您是否测试了您已经拥有的东西以查看它是否仍然有效?因为确实如此。

标签: python list sorting dictionary ordereddictionary


【解决方案1】:

您是否测试了您已经必须查看的内容是否仍然有效?因为确实如此。当您对一组序列进行排序时,它们会“按字母顺序”进行比较 - 如果两个序列的第一项相等,则比较它们的第二项,依此类推。这意味着,在您的示例中,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])])

【讨论】:

    【解决方案2】:

    您只需提及v[0],而不是v,这是您要排序的值索引。

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

    【讨论】:

      【解决方案3】:

      你快到了!

      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) 之间存在区别。在后一种情况下,您将传递一个元组进行比较。它可能不会做你想要的。阅读元组比较的工作原理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        • 2019-02-25
        • 2022-11-14
        相关资源
        最近更新 更多