我有一个字典列表,如下所示:
[
{ "id": "mm", "f": "d", "position": "1" },
{"id": "mm", "f": "s", "position": "2"},
{"id": "mm", "f": "a", "position": "3"},
{"id": "mm", "f": "d", "position": "4"},
{"id": "m2", "f": "zz", "position": "2"},
{"id": "m2", "f": "s", "position": "1"},
{"id": "m2", "f": "f", "position": "4"},
{"id": "m2", "f": "d", "position": "3"}
]
我想在每个字典中插入键“上一个”,该键包含字典中“ f”键的值,该键与所讨论的那个具有相同的“ id”,但其“位置”与该位置相同所讨论的那个的“位置”-1(如果字典不存在,则“上一个”:“没有”)。
我尝试使用itertools.combinations()
+过滤,嵌套的for循环,filter(),但是解释器死机了。
理想情况下什么是最佳方法?我是否应该先对所有字典进行排序,然后再使用索引,而不是尝试遍历整个列表(对于每个重复)针对for循环中的每个字典查找我感兴趣的字典?谢谢。
答案 0 :(得分:1)
如果您使用的是Python 3:
items = [
{ "id": "mm", "f": "d", "position": "1" },
{"id": "mm", "f": "s", "position": "2"},
{"id": "mm", "f": "a", "position": "3"},
{"id": "mm", "f": "d", "position": "4"},
{"id": "m2", "f": "zz", "position": "2"},
{"id": "m2", "f": "s", "position": "1"},
{"id": "m2", "f": "f", "position": "4"},
{"id": "m2", "f": "d", "position": "3"}
]
new = [{**item, 'previous': items[i-1].get('f')} for i, item in enumerate(items)]
答案 1 :(得分:0)
您可以用这样的熊猫来做到这一点:
import pandas as pd
import numpy as np
df = pd.DataFrame(items)
df['previous'] = np.roll(df.f, shift=1)
df.to_dict(orient='records')
输出
[{'id': 'mm', 'f': 'd', 'position': '1', 'previous': 'd'},
{'id': 'mm', 'f': 's', 'position': '2', 'previous': 'd'},
{'id': 'mm', 'f': 'a', 'position': '3', 'previous': 's'},
{'id': 'mm', 'f': 'd', 'position': '4', 'previous': 'a'},
{'id': 'm2', 'f': 'zz', 'position': '2', 'previous': 'd'},
{'id': 'm2', 'f': 's', 'position': '1', 'previous': 'zz'},
{'id': 'm2', 'f': 'f', 'position': '4', 'previous': 's'},
{'id': 'm2', 'f': 'd', 'position': '3', 'previous': 'f'}]