【发布时间】:2019-04-06 04:33:24
【问题描述】:
我创建了一个函数,它接受字典的多个参数,并返回一个连接的字典。我在网上研究了一段时间关于连接合并字典并测试了有趣的字典。它们都导致更新值(或覆盖它们)。
我的用例是传入字典,其中每个键都有一个值,并且想要一个具有相同或不同键的字典,每个键都有一个值列表。这就是我对所谓的字典“串联”的定义。
这里有两个非常基本的字典:
a = {1: 'a', 2: 'b', 3: 'c'}
b = {1: 'd', 2: 'e', 3: 'f'}
函数如下:
def merge_dict(*args:dict):
result = {}
for arg in args:
if not isinstance(arg, dict):
return {}
result_keys = result.keys()
for key, value in arg.items():
if key not in result_keys:
result[key] = [value]
else:
result[key].append(value)
return result
输出是:
print(merge_dict(a, b))
{1: ['a', 'd'], 2: ['b', 'e'], 3: ['c', 'f']}
我可以对元组、数组、Numpy 数组等做同样的事情。请注意,这个函数非常简单,除了作为 dict 实例之外,它不会清理输入或验证数据结构。
但是,我想知道是否有更有效或“pythonic”的方式来做到这一点。请随时添加您的输入。
考虑使用不同的键添加这些字典:
c = {4: 'g', 5: 'h', 6: 'i'}
d = {4: 'j', 5: 'k', 6: 'l'}
输出是:
print(merge_dict(a, b, c, d))
{1: ['a', 'd'], 2: ['b', 'e'], 3: ['c', 'f'], 4: ['g', 'j'], 5: ['h', 'k'], 6: ['i', 'l']}
我很快就会研究嵌套数据结构。
由于您的回答,我做了以下事情:
import collections
def merge_dicts_1(*args):
rtn = collections.defaultdict(list)
for input_dict in args:
for key, value in input_dict.items():
rtn[key].append(value)
return rtn
def merge_dicts_2(*args):
rtn = {}
for input_dict in args:
for key, value in input_dict.items():
rtn.setdefault(key, []).append(value)
return rtn
if __name__ == "__main__":
a = {1: 'a', 2: 'b', 3: 'c'}
b = {1: 'd', 2: 'e', 3: 'f'}
c = {4: 'g', 5: 'h', 6: 'i'}
d = {4: 'j', 5: 'k', 6: 'l'}
e = merge_dicts_1(a, b, c, d)
f = merge_dicts_2(a, b, c, d)
print(e)
print(f)
print(e == f)
这将打印以下内容:
defaultdict(<class 'list'>, {1: ['a', 'd'], 2: ['b', 'e'], 3: ['c', 'f'], 4: ['g', 'j'], 5: ['h', 'k'], 6: ['i', 'l']})
{1: ['a', 'd'], 2: ['b', 'e'], 3: ['c', 'f'], 4: ['g', 'j'], 5: ['h', 'k'], 6: ['i', 'l']}
True
谢谢!
【问题讨论】:
-
只存在于一个字典中的键应该怎么办?如果一个值是一个嵌套的 dict 会发生什么?
-
@Mr.Llama 这些都是好问题。我可以让函数查找它,但这不是我的用例。它可以遍历键并递归检查其类型,但这不是该函数的最初目的。
-
@Mr.Llama 我更新了问题以包括添加不同键的字典的用例。该函数按我的预期处理它。
-
不是我问的那样,但还是不错的。我想知道更多
merge_dict({'a': 1}, {'b': 2})应该返回什么。应该是{'a': [1], 'b': [2]}还是{'a': 1, 'b': 2}? -
尝试使用
defaultdict(list)
标签: python dictionary merge concatenation