我有一个字典列表,
input = [{"id":2, "color":"green"},
{"id":3, "color":"red"},
{"id":2, "gender":"male"},
{"id":3, "food":"ice_cream"},
{"id":1, "food":"fish"}]
Run Code Online (Sandbox Code Playgroud)
和我的预期输出为
output =[{"id":1, "food":"fish"},
{"id":2, "color":"green", "gender":"male"},
{"id":3, "color":"red", "food":"ice_cream"}]
Run Code Online (Sandbox Code Playgroud)
有没有比几个嵌套for循环更简单的方法?
你不需要嵌套循环,只需一个简单的for循环即可:
>>> from collections import defaultdict
>>> output = defaultdict(dict)
>>> for d in input_:
... output[d['id']].update(d)
...
>>> output.values()
dict_values([{'id': 2, 'color': 'green', 'gender': 'male'}, {'id': 3, 'color': 'red', 'food': 'ice_cream'}, {'id': 1, 'food': 'fish'}])
Run Code Online (Sandbox Code Playgroud)
现在您可以按输出值排序id.
>>> [output[k] for k in sorted(output)]
[{'food': 'fish', 'id': 1},
{'color': 'green', 'gender': 'male', 'id': 2},
{'color': 'red', 'food': 'ice_cream', 'id': 3}]
Run Code Online (Sandbox Code Playgroud)
如果数据很大,并且您想要避免最后的O(n log n)排序步骤,则可以预先迭代输入以查找id列表,并保持线性复杂度(这类似于基数排序)).
如果你坚持这样做groupby(效率较低,可读性较差),你可以比接受的答案中的怪物更清洁.试试这个:
from itertools import groupby
from operator import itemgetter
from collections import ChainMap
k = itemgetter('id')
output = [dict(ChainMap(*group)) for _, group in groupby(sorted(input_, key=k), k)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |