2017-02-20 89 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']