【问题标题】:Ordering a list of dictionaries in python在python中订购字典列表
【发布时间】:2010-10-26 01:27:57
【问题描述】:

我有一个 python 字典列表:

mylist = [
{'id':0, 'weight':10, 'factor':1, 'meta':'ABC'},
{'id':1, 'weight':5, 'factor':1, 'meta':'ABC'},
{'id':2, 'weight':5, 'factor':2, 'meta':'ABC'},
{'id':3, 'weight':1, 'factor':1, 'meta':'ABC'}
]

按重量排序该列表的最有效/最干净的方法是什么,然后是因子(数字)。结果列表应如下所示:

mylist = [
{'id':3, 'weight':1, 'factor':1, 'meta':'ABC'},
{'id':1, 'weight':5, 'factor':1, 'meta':'ABC'},
{'id':2, 'weight':5, 'factor':2, 'meta':'ABC'},
{'id':0, 'weight':10, 'factor':1, 'meta':'ABC'},
]

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:
    decoratedlist = [(item[weight], item) for item in mylist]
    decoratedlist.sort()
    results = [item for (key, item) in decoratedlist]
    

    【讨论】:

    • 这不起作用(你的意思是“item['weight']”吗?)。此外,修复后,由于运气好,它可以在 cPython 中工作,但不必在其他 Python 实现中工作。元组应该有 3 个元素。另外,您不必重写列表,请查看已接受的答案。
    • 您是说 item['weight'] 吗?是的,我做到了;当我使用 sn-p 时,我从变量中获取了密钥,因此出现了错误。顺便说一句,它适用于 py2.4.4、2.5.1、2.5.2。
    【解决方案2】:

    我接受了 dF 的灵感答案,但这是我最终确定的方案:

    @staticmethod
    def ordered_list(mylist):
        def sort_func(d):
            return (d['weight'], d['factor'])
    
        mylist.sort(key=sort_func)
    

    【讨论】:

    • 'operator.itemgetter('weight', 'factor')' 是表达你的'sort_func'的pythonic方式。
    【解决方案3】:
    mylist.sort(key=lambda d: (d['weight'], d['factor']))
    

    import operator
    mylist.sort(key=operator.itemgetter('weight', 'factor'))
    

    【讨论】:

    • 我很乐意为此 +1,因为它使用密钥。我不能用 lambda +1 任何东西。对于 n00bz,def 版本通常比 lambda 更容易。
    • n00b 无法理解 lambda 并不意味着不应该使用它。实际上,lambdas 使代码更容易遵循,并允许一些其他方式不可能的魔法/糖。如果您不了解 lambda,您应该去搜索类似 stackoverflow.com/questions/150129/what-is-a-lambda 或 www.diveintopython.org/power_of_introspection/lambda_functions.html 的问题,并在您理解它们时回来。此外,stackoverflow.com/questions/134626/… 讨论了何时您应该使用 lambda。
    • 这不是理解或恐惧的问题。我厌倦了n00b问题。一个简单的def 以通常更容易理解和理解的方式做同样的事情。 30 年后,我了解到所有软件都由不了解细微差别的 n00bz 维护和“增强”。
    • 不向没有学习过 lambda 的人展示 lambda 有助于确保他们永远不会学习。
    • +1 因为它向我展示了 operator.itemgetter() (而且我不怕 lambda,顺便说一句)
    【解决方案4】:

    以下内容应该可以工作:

    def cmp_dict(x, y):
        weight_diff = y['weight'] - x['weight']
        if weight_diff == 0:
            return y['factor'] - x['factor']
        else:
            return weight_diff
    
    myList.sort(cmp_dict)
    

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2011-11-07
      • 2013-06-10
      • 2023-01-19
      • 2012-05-10
      • 2012-09-21
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      相关资源
      最近更新 更多