同一列表中字典的连接

时间:2019-12-12 01:10:49

标签: python list dictionary join

我有一个字典列表,如下所示:

[
  { "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循环中的每个字典查找我感兴趣的字典?谢谢。

2 个答案:

答案 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'}]