将两个字典与一个键和每个键中的一个元素组合在一起(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

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, 394, 56),(2013, 350, 23) 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)]}

相关内容

最新更新