将两个字典相加,字母数字项除外

时间:2019-03-21 10:12:03

标签: python dictionary

我尝试将两个字典中的特定项目相加,但是我总是得到一个空的字典。

d1 = {'primary_key': '01/01/20185511', 'Fecha': '01/01/2018', 'linea': '551', 'Sentido': '1', 'trayecto': '3', 'SA_A_': '0', 'SA_B1': '1', 'SA_B2': '2', 'SA_B3': '3'}

d2 = {'primary_key': '01/01/20185511', 'Fecha': '01/01/2018', 'linea': '551', 'Sentido': '1', 'trayecto': '4', 'SA_A_': '1', 'SA_B1': '1', 'SA_B2': '2', 'SA_B3': '3'}

结果应该是

{'SA_A_': '1', 'SA_B1': '2', 'SA_B2': '4', 'SA_B3': '6'}

我正在尝试

{key: int(d1.get(key, 0)) + int(d2.get(key, 0)) for key in set(d1) | set(d2) if key is not 'primary_key' and not 'Fecha' and not 'linea' and not 'Sentido' and not 'trayecto'}

但是输出是

{}

3 个答案:

答案 0 :(得分:0)

使用dict-comprehension

print({k2: int(v) + int(v2) for (k,v), (k2,v2) in zip(d1.items(),d2.items()) if k2 in select_list})

意思是:

d1 = {'primary_key': '01/01/20185511', 'Fecha': '01/01/2018', 'linea': '551', 'Sentido': '1', 'trayecto': '3', 'SA_A_': '0', 'SA_B1': '1', '': '2', 'SA_B3': '3'}
d2 = {'primary_key': '01/01/20185511', 'Fecha': '01/01/2018', 'linea': '551', 'Sentido': '1', 'trayecto': '4', 'SA_A_': '1', 'SA_B1': '1', 'SA_B2': '2', 'SA_B3': '3'}
d3 = {}    
select_list = ['SA_A_', 'SA_B1','SA_B2','SA_B3']

for (k,v), (k2,v2) in zip(d1.items(),d2.items()):
    if k2 in select_list:
        d3[k2] = int(v) + int(v2)
print(d3)

输出

{'SA_A_': 1, 'SA_B1': 2, 'SA_B2': 4, 'SA_B3': 6}

答案 1 :(得分:0)

您可以尝试这种方式:

{key: int(d1[key]) + int(d2[key]) for key in [val for val in d1.keys()] if key in ['SA_A_', 'SA_B1', 'SA_B2', 'SA_B3']}

或者您可以这样做:

{key: int(d1[key]) + int(d2[key]) for key in [val for val in d1.keys()] if key[0:2] == 'SA'}

输出:

{'SA_A_': 1, 'SA_B1': 2, 'SA_B2': 4, 'SA_B3': 6}

答案 2 :(得分:0)

您可以像使用collections.Counter

>>> import collections
>>> d1
{'primary_key': '01/01/20185511', 'Fecha': '01/01/2018', 'linea': '551', 'Sentido': '1', 'trayecto': '3', 'SA_A_': '0', 'SA_B1': '1', 'SA_B2': '2', 'SA_B3': '3'}
>>> d2
{'primary_key': '01/01/20185511', 'Fecha': '01/01/2018', 'linea': '551', 'Sentido': '1', 'trayecto': '4', 'SA_A_': '1', 'SA_B1': '1', 'SA_B2': '2', 'SA_B3': '3'}
>>> d1c = {k:int(v) for k,v in d1.items() if k.startswith('SA')}
>>> d2c = {k:int(v) for k,v in d2.items() if k.startswith('SA')}
>>> d1c
{'SA_A_': 0, 'SA_B1': 1, 'SA_B2': 2, 'SA_B3': 3}
>>> d2c
{'SA_A_': 1, 'SA_B1': 1, 'SA_B2': 2, 'SA_B3': 3}
>>> collections.Counter(d1c) + collections.Counter(d2c)
Counter({'SA_B3': 6, 'SA_B2': 4, 'SA_B1': 2, 'SA_A_': 1})