2017-03-18 294 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 
相關問題