2017-02-20 133 views
0

當改寫說我們有2個字典第一個是使用openpyxl從一個文件名爲excel2013.xlsx和excel2014.xlsx第二個提取:合併字典

d1={'nume': 'Barta', 'cifra afaceri': 200, 'cifra2': 24} 
d2={'nume': 'Barta', 'cifra afaceri': 190, 'cifra3': 21} 

這些字典都是清單的一部分字典。

lista=[{'nume': 'Barta', 'cifra afaceri': 200, 'cifra2': 24},{'nume': 'Barta', 'cifra afaceri': 190, 'cifra3': 21}] 

首先,我想要做的是去了這個名單,並找到基於一個鍵複製,在這種情況下,關鍵「nume」。從這些副本中,我需要獲取包含d1和d2所有密鑰的新字典。我的解決方法是這樣的:

import os 
import itertools 
ultima_lista=[] 
ultima=[] 
for a, b in itertools.combinations(lista,2): 
    if a['nume'] == b['nume']: 
     z=dict(list(a.items())+ list(b.items())) 
     ultima_lista.append(z) 
print(*ultima_lista, sep='\n') 
print('------------------------------------------------------------------------------------------------------') 
for a in lista: 
    for b in ultima_lista: 
     if a['nume'] == b['nume']: 
      ultima.append(a) 
print (*ultima, sep='\n') 
print('------------------------------------------------------------------------------------------------------') 
for i in ultima_lista: 
    lista.append(i) 
for i in ultima: 
    lista.remove(i) 
print(*lista, sep='\n') 

現在這個解決方案是爲了一個更大的列表,我們在這裏只有2個字典。然而,使用這種方法,我無法控制數據被覆蓋的密鑰'cifra afaceri' - 哪些數據保留,來自dict1或dict2。在這個例子中我需要的最新信息,這是excel2014是在頂部,這意味着我需要的輸出應該是:

lista=[{'nume': 'Barta', 'cifra afaceri': 190, 'cifra2': 24,'cifra3': 21 } 

我想再拍字典中的鍵是「LISTA元素'和值是從文件名提取的年份。想法?| Thx

+1

歡迎來到Stacko verflow!在發佈問題後,請花點時間仔細閱讀:您忘記使用正確的語法來格式化您的代碼,因此您的帖子看起來像一團糟。有人不得不爲你編輯它,如果他們不需要,因爲你按照發布說明=) –

+2

我覺得我不理解。你想要的只是'd1.update(d2)'? – Batman

+0

@Batman在這個例子中,它會工作,但想象你有10個字典具有相同的'密'鍵。也許最新的並沒有其他人擁有的所有鑰匙。 – Mike

回答

0

也許保留一個列表作爲字典中的值並附加每個字典中的值。這樣,具有相同密鑰的值將在列表中。除此之外,你循環的最後一個字典將被追加到列表的末尾,所以你可以使用它作爲你的「優先級」。

d1={'nume': 'Barta', 'cifra afaceri': 200, 'cifra2': 24} 
d2={'nume': 'Barta', 'cifra afaceri': 190, 'cifra3': 21} 
result=dict() 

for key, value in d1.items(): 
    if key in result: 
     result[key].append(value) 
    else: 
     result[key] = [value] 

for key, value in d2.items(): 
    if key in result: 
     result[key].append(value) 
    else: 
     result[key] = [value] 

print(result) 

>>> {'cifra afaceri': [200, 190], 'cifra2': [24], 'cifra3': [21], 'nume': ['Barta', 'Barta']} 

編輯

如果您不需要重複鍵以前的值,你可以用update有人在意見中提出的問題。您只需要以最高優先級進行更新(例如,上次更新應該是最新的Excel工作表,因此它們的值優先)。

d1={'nume': 'Barta', 'cifra afaceri': 200, 'cifra2': 24} 
d2={'nume': 'Barta', 'cifra afaceri': 190, 'cifra3': 21} 
d3={'something': 'Barta', 'something else': 198, 'cifra3': 100} 
result=dict() 

# The order here is the priority, last update ends up with its value 
# for the given key if duplicates 
d1.update(d2) 
d1.update(d3) 

print(d1) 

>>> {'cifra2': 24, 'cifra afaceri': 190, 'nume': 'Barta', 'something else': 198, 'something': 'Barta', 'cifra3': 100} 
+0

這是一個好主意,但我使用openpyxl將很多.xlsx文件合併爲1,所以我只需要每個鍵的1個值,並且1值需要是最新的一個 - 這意味着字典必須來自newes xlsx文件,所以當我將它們轉儲到最終的Excel中時,我每個單元格都有一個值。 – Mike

0

怎麼樣groupby關鍵nume第一,然後做了字典更新以後:

from itertools import groupby 

d = [{'nume': 'Barta', 'cifra afaceri': 200, 'cifra2': 24}, 
    {'nume': 'Barta', 'cifra afaceri': 190, 'cifra3': 21}, 
    {'nume': 'Daniel', 'cifra afaceri': 190, 'cifra3': 21}] 

d_all = list() 
for key, group in groupby(d, key=lambda x: x['nume']): 
    d_update = dict() 
    for d in group: 
     d_update.update(d) 
    d_all.append(d_update) 

輸出如下:

[{'cifra afaceri': 190, 'cifra2': 24, 'cifra3': 21, 'nume': 'Barta'}, 
{'cifra afaceri': 190, 'cifra3': 21, 'nume': 'Daniel'}] 
0

這個怎麼樣

import itertools 

temp = [x.items() for x in lista if x['nume'] == 'Barta'] 
flattened_temp = list(itertools.chain.from_iterable(temp)) 

d1_and_d2_keys = set(d1.keys() + d2.keys())  

sub_answer = {k: v for k, v in flattened_temp if k in d1_and_d2_keys} 

sub_answer['cifra afaceri'] = d2['cifra afaceri']