我有两个字典:
比方说
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)]}