我研究了很多类似的问题,但似乎找不到解决办法。我想要实现的是获得两本这种形式的词典,每一本:
{'apple': ['5', '65'], 'blue': ['9', '10', '15', '43'],
'is': ['5', '6', '13', '45', '96'], 'yes': ['1', '2', '3', '11'],
'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '29', '45']}
{'apple': ['43'], 'appricote': ['1', '2', '3', '4', '5', '6'],
'candle': ['1', '2', '4', '5', '6', '9'], 'delta': ['14', '43', '47'],
'dragon': ['23', '24', '25', '26'], 'eclipse': ['11', '13', '15', '19'],
'island': ['1', '34', '35']}我想要用以下的格式:
apple ['5', '43', '65']
apricot ['1', '2', '3', '4', '5', '6']
blue ['9', '10', '15', '43']
candle ['1', '2', '4', '5', '6', '9']
delta ['14', '43', '47']
dragon ['23', '24', '25', '26']
eclipse ['11', '13', '15', '19']
is ['5', '6', '13', '45', '96']
island ['1', '34', '35']
yes ['1', '2', '3', '11']
zone ['5', '6', '9', '10', '12', '14', '18', '19', '29', '45']但这是我得到的格式:
apple [['5', '65'], ['43']]
blue [['9', '10', '15', '43']]
is [['5', '6', '13', '45', '96']]
yes [['1', '2', '3', '11']]
zone [['5', '6', '9', '10', '12', '14', '18', '19', '29', '45']]
appricote [['1', '2', '3', '4', '5', '6']]
candle [['1', '2', '4', '5', '6', '9']]
delta [['14', '43', '47']]
dragon [['23', '24', '25', '26']]
eclipse [['11', '13', '15', '19']]
island [['1', '34', '35']]到目前为止,这是我的代码
def merge_dictionaries(dict1, dict2):
from itertools import chain
from collections import defaultdict
dict3 = defaultdict(list)
for k, v in chain(dict1.items(), dict2.items()):
dict3[k].append(v)
for k, v in dict3.items():
print(k, v)因此,我的问题是,我是否应该进一步处理我现在的格式,还是有可能立即实现我想要的格式。例如,如果您告诉我处理我已经实现的格式,我可以将子列表合并为每个键的一个列表,然后排序,以及对键进行排序。但我想知道是否有更直接的方法。
发布于 2018-04-25 08:30:40
这里有一种没有collections的方法。其思想是迭代字典键的联合,然后使用dict.get的默认参数。
d1 = {'apple': ['5', '65'], 'blue': ['9', '10', '15', '43'],
'is': ['5', '6', '13', '45', '96'], 'yes': ['1', '2', '3', '11'],
'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '29', '45']}
d2 = {'apple': ['43'], 'appricote': ['1', '2', '3', '4', '5', '6'],
'candle': ['1', '2', '4', '5', '6', '9'], 'delta': ['14', '43', '47'],
'dragon': ['23', '24', '25', '26'], 'eclipse': ['11', '13', '15', '19'],
'island': ['1', '34', '35']}
res = {}
for key in set().union(*(d1, d2)):
res[key] = sorted(d1.get(key, []) + d2.get(key, []), key=int)结果:
{'apple': ['5', '43', '65'],
'appricote': ['1', '2', '3', '4', '5', '6'],
'blue': ['9', '10', '15', '43'],
'candle': ['1', '2', '4', '5', '6', '9'],
'delta': ['14', '43', '47'],
'dragon': ['23', '24', '25', '26'],
'eclipse': ['11', '13', '15', '19'],
'is': ['5', '6', '13', '45', '96'],
'island': ['1', '34', '35'],
'yes': ['1', '2', '3', '11'],
'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '29', '45']}或者通过同等的字典理解:
res = {key: sorted(d1.get(key, []) + d2.get(key, []), key=int)
for key in set().union(*(d1, d2))}对于有序字典,事后使用collections.OrderedDict。
from collections import OrderedDict
res = OrderedDict(sorted([(k, v) for k, v in res.items()]))发布于 2018-04-25 08:21:41
您需要使用list.extend而不是list.append
>>> d = defaultdict(list)
>>> for k,v in chain(dict1.items(), dict2.items()):
... d[k].extend(v)
...
>>> d
defaultdict(<class 'list'>, {'apple': ['5', '65', '43'], 'blue': ['9', '10', '15', '43'], 'is': ['5', '6', '13', '45', '96'], 'yes': ['1', '2', '3', '11'], 'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '29', '45'], 'appricote': ['1', '2', '3', '4', '5', '6'], 'candle': ['1', '2', '4', '5', '6', '9'], 'delta': ['14', '43', '47'], 'dragon': ['23', '24', '25', '26'], 'eclipse': ['11', '13', '15', '19'], 'island': ['1', '34', '35']})如果结果列表的顺序很重要,则可以对其进行排序。
发布于 2018-04-25 08:21:45
你的代码太复杂了。
a = {'apple': ['5', '65'], 'blue': ['9', '10', '15', '43'],
'is': ['5', '6', '13', '45', '96'], 'yes': ['1', '2', '3', '11'],
'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '29', '45']}
b = {'apple': ['43'], 'appricote': ['1', '2', '3', '4', '5', '6'],
'candle': ['1', '2', '4', '5', '6', '9'], 'delta': ['14', '43', '47'],
'dragon': ['23', '24', '25', '26'], 'eclipse': ['11', '13', '15', '19'],
'island': ['1', '34', '35']}
output = []
for key in a:
temp = a[key]
if key in b:
temp.extend(b[key])
output.append('{} {}'.format(key, sorted(temp)))
print('\n'.join(output))
# is ['13', '45', '5', '6', '96']
# blue ['10', '15', '43', '9']
# zone ['10', '12', '14', '18', '19', '29', '45', '5', '6', '9']
# apple ['43', '5', '65']
# yes ['1', '11', '2', '3']警告:
a是一个字典,输出字符串中元素的顺序不是持久的(在Python3.6中)如果两者相关,这两点都可以很容易地加以修正。
https://stackoverflow.com/questions/50017243
复制相似问题