2017-03-18 296 views
0

我想合并两个ID字段。字典x包含许多不同的ID和每个ID不同的行数。字典y包含多个键值,并且总是比dict x少。合并Python列表按键值分组的字典

x = [{'costgroup': '1', 'POC1': '2', 'post': '5','id': '1'}, 
    {'costgroup': '2', 'POC1': '1', 'post': '4','id': '1'}, 
    {'costgroup': '3', 'POC1': '5', 'post': '2', 'id': '1'}, 
    {'costgroup': '1', 'POC1': '2', 'post': '5','id': '2'}, 
    {'costgroup': '2', 'POC1': '1', 'post': '4','id': '2'}, 
    {'costgroup': '3', 'POC1': '5', 'post': '2', 'id': '2'}, 
    {'costgroup': '3', 'POC1': '5', 'post': '2', 'id': '2'}] 


y = [{'id': '1', 'laminate': 'D'}, 
    { 'id':'2', 'laminate': T'}]  

的输出,我想是这样的:

z = [{'costgroup': '1', 'POC1': '2', 'post': '5','id': '1','laminate':'D'}, 
    {'costgroup': '2', 'POC1': '1', 'post': '4','id': '1','laminate': 'D'}, 
    {'costgroup': '3', 'POC1': '5', 'post': '2', 'id': '1','laminate': 'D'}, 
    {'costgroup': '1', 'POC1': '2', 'post': '5','id': '2','laminate': 'T'}, 
    {'costgroup': '2', 'POC1': '1', 'post': '4','id': '2','laminate': 'T'}, 
    {'costgroup': '3', 'POC1': '5', 'post': '2', 'id': '2','laminate': 'T'}, 
    {'costgroup': '3', 'POC1': '5', 'post': '2', 'id': '2','laminate': 'T'}] 

这是很容易使用熊猫

dfx = pd.DataFrame(x) 
dfy = pd.DataFrame(y) 
pd.merge(dfx,dfy, how ='left', left_on = 'id', right_on = 'id') 

实现但是,我会这样使用AWS lambda函数应用而且我不想承担大熊猫的开销,并且输出需要是字典。我尝试了下面的代码让我更接近,但后来我不得不添加一些东西来找到ID的不同值并遍历它们。但是,仍然没有我需要的输出。

valuelist = ['1'] 
def copyf(dictlist, key, valuelist): 
     return [d for d in dictlist if d[key] in valuelist] 

y1 = copyf(y, 'id', valuelist) 
x1 = copyf(x, 'id', valuelist) 
y1.append(x1) 

上面提供了这个输出,这是有趣的,但不是我所需要的。

[{'distance': '2', 'id': '1', 'laminate': 'D'}, 
[{'POC1': '2', 'costgroup': '1', 'id': '1', 'post': '5'}, 
    {'POC1': '1', 'costgroup': '2', 'id': '1', 'post': '4'}, 
    {'POC1': '5', 'costgroup': '3', 'id': '1', 'post': '2'}]] 
+0

'y'中的'ids'是否是唯一的? – schwobaseggl

+0

是的,ids在y中是唯一的 – Erich

回答

2
def merge(d1, d2): 
    """Given two dicts, merge them into a new dict as a shallow copy.""" 
    result = d1.copy() 
    result.update(d2) 
    return result 

result = [merge(d1, d2) for d1 in x for d2 in y if d1["id"] == d2["id"]] 
print(result) 

给出了从这里

[{'POC1': '2', 'costgroup': '1', 'id': '1', 'laminate': 'D', 'post': '5'}, 
{'POC1': '1', 'costgroup': '2', 'id': '1', 'laminate': 'D', 'post': '4'}, 
{'POC1': '5', 'costgroup': '3', 'id': '1', 'laminate': 'D', 'post': '2'}, 
{'POC1': '2', 'costgroup': '1', 'id': '2', 'laminate': 'T', 'post': '5'}, 
{'POC1': '1', 'costgroup': '2', 'id': '2', 'laminate': 'T', 'post': '4'}, 
{'POC1': '5', 'costgroup': '3', 'id': '2', 'laminate': 'T', 'post': '2'}, 
{'POC1': '5', 'costgroup': '3', 'id': '2', 'laminate': 'T', 'post': '2'}] 

合并功能:How to merge two Python dictionaries in a single expression?

在Python 3.5中有一个更简洁的语法,但你在2.7。

2
import copy 

x = [{'costgroup': '1', 'POC1': '2', 'post': '5','id': '1'}, 
    {'costgroup': '2', 'POC1': '1', 'post': '4','id': '1'}, 
    {'costgroup': '3', 'POC1': '5', 'post': '2', 'id': '1'}, 
    {'costgroup': '1', 'POC1': '2', 'post': '5','id': '2'}, 
    {'costgroup': '2', 'POC1': '1', 'post': '4','id': '2'}, 
    {'costgroup': '3', 'POC1': '5', 'post': '2', 'id': '2'}, 
    {'costgroup': '3', 'POC1': '5', 'post': '2', 'id': '2'}] 


y = [{'id': '1', 'laminate': 'D'}, 
    { 'id':'2', 'laminate': 'T'} 
] 

#create the id->laminate mapping 
m = { d['id']: d['laminate'] for d in y } 

#create the final output 
z = [] 
for d in x: 
    #make a copy of the dictionary from x so that the input data 
    #is not overwritten 
    item = dict(d) #copy.deepcopy(d) 
    item.update({'laminate': m[d['id']]}) 
    z.append(item) 

print(z) 

这将产生

[ 
{'laminate': 'D', 'post': '5', 'POC1': '2', 'id': '1', 'costgroup': '1'}, 
{'laminate': 'D', 'post': '4', 'POC1': '1', 'id': '1', 'costgroup': '2'}, 
{'laminate': 'D', 'post': '2', 'POC1': '5', 'id': '1', 'costgroup': '3'}, 
{'laminate': 'T', 'post': '5', 'POC1': '2', 'id': '2', 'costgroup': '1'}, 
{'laminate': 'T', 'post': '4', 'POC1': '1', 'id': '2', 'costgroup': '2'}, 
{'laminate': 'T', 'post': '2', 'POC1': '5', 'id': '2', 'costgroup': '3'}, 
{'laminate': 'T', 'post': '2', 'POC1': '5', 'id': '2', 'costgroup': '3'}] 
1
z = [] 
for dx in x: 
    for dy in y: 
     if dx['id'] == dy['id']: 
      z.append(dict(dx.items() + dy.items())) 

print z 
相关问题