将两个字典与每个键中的一个键和一个元素相结合(python)

2024-05-23 18:35:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两本字典:

比如说

MaleDict = {'Jason':[(2014, 394),(2013, 350)...], 'Stephanie':[(2014, 3), (2013, 21),..]....}
FemaleDict = {'Jason':[(2014, 56),(2013, 23)...], 'Stephanie':[(2014, 335), (2013, 217),..]....}

我正试图把这些词典合并起来,以便

CompleteDict = {'Jason':[(2014, 394, 56),(2013, 350, 23)...], 'Stephanie':[(2014, 3, 335), (2013, 21, 217),..]....}

我有一段时间不太擅长循环,所以我想我会尝试使用列表理解。你知道吗

[BaseDict[x].append((i[0], i[1], j[1])) for i in MaleDict[x] for j in FemaleDict[y] if x == y and i[0] == j[0]]

我总是犯一个不可原谅的错误。看起来我也不太擅长列表理解,哈哈。任何帮助都将不胜感激。你知道吗

Python3


Tags: in列表forif字典词典我会append
2条回答

for循环是python的王道。while循环有自己的位置,但是python中的大多数对象都可以使用for item in object:语法进行迭代。你知道吗

有一种方法:

from collections import defaultdict

MaleDict = {'Jason':[(2014, 394),(2013, 350)], 'Stephanie':[(2014, 3), (2013, 21),]}
FemaleDict = {'Jason':[(2014, 56),(2013, 23)], 'Stephanie':[(2014, 335), (2013, 217),]}

name_keys = set(MaleDict.keys() + FemaleDict.keys())

combined_names = {}
for name_key in name_keys:
    combined_values = defaultdict(list)
    male_values_dict = dict(MaleDict[name_key])
    female_values_dict = dict(FemaleDict[name_key])
    year_keys = set(male_values_dict.keys() + female_values_dict.keys())
    for year_key in year_keys:
        combined_values[year_key].append(male_values_dict[year_key])
        combined_values[year_key].append(female_values_dict[year_key])
    combined_names[name_key] = dict(combined_values)

输出:

{'Jason': {2013: [350, 23], 2014: [394, 56]},
'Stephanie': {2013: [21, 217], 2014: [3, 335]}}

或者如果希望将元组保留为值:

from collections import defaultdict

MaleDict = {'Jason':[(2014, 394),(2013, 350)], 'Stephanie':[(2014, 3), (2013, 21),]}
FemaleDict = {'Jason':[(2014, 56),(2013, 23)], 'Stephanie':[(2014, 335), (2013, 217),]}

name_keys = set(MaleDict.keys() + FemaleDict.keys())

combined_names = {}
for name_key in name_keys:
    combined_values = []
    male_values_dict = dict(MaleDict[name_key])
    female_values_dict = dict(FemaleDict[name_key])
    year_keys = set(male_values_dict.keys() + female_values_dict.keys())
    for year_key in year_keys:
        tuple_result = (year_key, male_values_dict[year_key], female_values_dict[year_key])
        combined_values.append(tuple_result)
    combined_names[name_key] = combined_values

输出:

{'Jason': [(2013, 350, 23), (2014, 394, 56)],
 'Stephanie': [(2013, 21, 217), (2014, 3, 335)]}    

注:如果2014年和2013年是你的钥匙,那么字典在这里更合适。你知道吗

看看这个脚本:

>>> MaleDict = {'Jason':[(2014, 394),(2013, 350)], 'Stephanie':[(2014, 3), (2013, 21),]}
>>> FemaleDict = {'Jason':[(2014, 56),(2013, 23)], 'Stephanie':[(2014, 335), (2013, 217),]}
>>> 
>>> #clone MaleDict, to have a base to append FemaleItems
... combined_dict = dict(MaleDict)
>>> for name, items in FemaleDict.items():
...     for idx,year_tuple in enumerate(combined_dict.get(name,[])):
...         year_tuple = list(year_tuple) #convert to list to let us modify its items
...         for year_data in items[idx]:  #inspect same year-element of both dicts
...             if year_data not in year_tuple: # if the current part doesn't exist, append it to temp list
...                 year_tuple.append(year_data)
...         combined_dict[name] [idx] = tuple(year_tuple) #finally replace the current tuple by new one
... 
>>> 
>>> combined_dict
{'Jason': [(2014, 394, 56), (2013, 350, 23)], 'Stephanie': [(2014, 3, 335), (2013, 21, 217)]}

相关问题 更多 >