【问题标题】:Sort a list of dictionary provided an order排序字典列表提供了一个顺序
【发布时间】:2016-05-06 19:38:59
【问题描述】:

我有一个清单

order = [8, 7, 5, 9, 10, 11]

还有一个字典列表

list_of_dct = [{'value':11}, {'value':8}, {'value':5}, {'value':7}, {'value':10}, {'value':9}]

我想按照order 列表中给出的顺序对这个list_of_dct 进行排序,即输出应该如下:

list_of_dct = [{'value':8}, {'value':7}, {'value':5}, {'value':9}, {'value':10}, {'value':11}]

我知道如何按给定的key 排序,但不是在已经下达订单时。如何排序?

PS:我已经有一个 O(n^2) 的解决方案。寻找更好的解决方案。

【问题讨论】:

  • 对于列表中的所有字典,键 value 是静态的还是只是一个占位符?此外,order 列表是否包含字典中存在的所有项目,即重复项?
  • 与其执行一般排序,不如构建一个包含值作为键的dict,然后从中按顺序提取条目会更有效。问题:(1)order 中的每个值是否已知作为list_of_dct 中的值存在? (2)list_of_dct中同一个值可以出现多次吗?

标签: python list sorting dictionary


【解决方案1】:

使用order 列表的索引进行排序-只要尝试每个字典都有一个值并且您希望按该值排序-

sorted(list_of_dct,key=lambda x:order.index(x.values()[0]))

但如果一个键有多个值,则更改要排序的索引(即[0])。

【讨论】:

    【解决方案2】:

    使用enumerate 进行 8 到 0、7 到 1、...、11 到 5 的映射:

    >>> order = [8,7,5,9,10,11]
    >>> list_of_dct = [{'value':11}, {'value':8}, {'value':5},
                       {'value':7}, {'value':10}, {'value':9}]
    >>> sort_keys = {item: i for i, item in enumerate(order)}
    >>> sort_keys
    {5: 2, 7: 1, 8: 0, 9: 3, 10: 4, 11: 5}
    

    并将其用作排序键:

    >>> list_of_dct.sort(key=lambda d: sort_keys.get(d['value'], len(sort_keys)))
    >>> list_of_dct
    [{'value': 8}, {'value': 7}, {'value': 5}, {'value': 9},
     {'value': 10}, {'value': 11}]
    

    使用sort_keys.get(..) 而不是sort_keys[..] 来防止KeyErrororder 中的值错误的情况下。

    【讨论】:

    • 赞成它,因为 dict 查找只有 0(1) 复杂度。
    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多