繁体   English   中英

根据另一个列表的顺序对字典列表进行排序

[英]Sort a list of dict according to an order of another list

我有一个列表和另一个由字典组成的列表。

list1 = ['d', 'a', 'c', 'b', 'e', 'g']
list2 = [{'key1':'a', 'key2': 'asdf'}, {'key1': 'f', 'key2': 'dd'}, {'key1': 'b', 'key2': 'afd'}, {'key1': 'c', 'key2': 'ff'}, {'key1': 'd', 'key2': 'aa'}, {'key1': 'e', 'key2': 'aab'}]

list1 和 list2 都没有排序。

我想对 list2 进行排序,以便 list2 中“key1”的顺序与它在 list1 中出现的顺序相同。

list1 中的某些元素可能不包含在 list2 的 key1 中。 同样,list2 的某些元素可能不在 list1 中。

期望的结果是

 [{'key1': 'd', 'key2': 'aa'}, {'key1':'a', 'key2': 'asdf'}, {'key1': 'c', 'key2': 'ff'}, {'key1': 'b', 'key2': 'afd'}, , , {'key1': 'e', 'key2': 'aab'}]

list1 的公共元素和 list2 的 key1 是出现在 list1 中的“d”、“a”、“c”、“b”和“e”。 所以我选择了 list2 的元素,其中 key1 是上面的元素,其顺序与它在 list1 中出现的顺序相同。

您想要的结果不包括带有'key1': 'f'的字典,因此我假设您想过滤掉无法根据您指定的规则进行排序的所有内容。 从那里开始:

>>> list1 = ['d', 'a', 'c', 'b', 'e', 'g']
>>> list2 = [{'key1':'a', 'key2': 'asdf'}, {'key1': 'f', 'key2': 'dd'}, {'key1': 'b', 'key2': 'afd'}, {'key1': 'c', 'key2': 'ff'}, {'key1': 'd', 'key2': 'aa'}, {'key1': 'e', 'key2': 'aab'}]
>>> [d for d in list2 if d['key1'] in list1]
[{'key1': 'a', 'key2': 'asdf'}, {'key1': 'b', 'key2': 'afd'}, {'key1': 'c', 'key2': 'ff'}, {'key1': 'd', 'key2': 'aa'}, {'key1': 'e', 'key2': 'aab'}]

然后根据list1key1index对其进行排序是一件简单的事情:

>>> sorted((d for d in list2 if d['key1'] in list1), key=lambda d: list1.index(d['key1']))
[{'key1': 'd', 'key2': 'aa'}, {'key1': 'a', 'key2': 'asdf'}, {'key1': 'c', 'key2': 'ff'}, {'key1': 'b', 'key2': 'afd'}, {'key1': 'e', 'key2': 'aab'}]

而不是使用sorted ,这将花费O(n log n)平均时间复杂度,您可以通过构建一个将list1中的每个键映射到其顺序索引的字典,从list2构建一个新字典,以线性时间复杂度实现所需的结果使用从key1的值映射的顺序索引,然后按索引顺序输出新字典的值:

order = {k: i for i, k in enumerate(list1)}
ordered = {order.get(record['key1']): record for record in list2}
print([ordered[i] for i in range(len(order)) if i in ordered])

这输出:

[{'key1': 'd', 'key2': 'aa'}, {'key1': 'a', 'key2': 'asdf'}, {'key1': 'c', 'key2': 'ff'}, {'key1': 'b', 'key2': 'afd'}, {'key1': 'e', 'key2': 'aab'}]

演示: https://replit.com/@blhsing/SimpleNecessaryClosedsource

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM