重命名键时如何合并具有相同键的字典?

时间:2020-06-18 13:45:47

标签: python dictionary merge key

我正在一个项目上,可能要有多个字典,这些字典都由相同的长度组成,并且还填充有相同的键,每个值都是不同的灰度图像,所以是数组。

d1 = {'1' : 'a1' , '2' : 'a2' , '3' : 'a3'} 
d2 = {'1' : 'b1' , '2' : 'b2' , '3' : 'b3'} 
d3 = {'1' : 'c1' , '2' : 'c2' , '3' : 'c3'}

您知道如何制作这些词典,并构建一个包含所有图片的大词典,但键从1开始到n结束,n是图片数吗?图片的顺序无关紧要。

赞:

d_new = { ' 1 ' : ' a1 ' , ' 2 ' : ' a2 ' , ' 3 ' : ' a3 ' , ' 4 ' : ' b1 ' , ' 5 ' : ' b2 ' , ' 6 ' : ' b3 ' , ' 7 ' : ' c1 ' , ' 8 ' : ' c2 ' , ' 9 ' : ' c3 ' }

因为键是相同的,所以我合并它们时只得到一本字典的长度的字典。手动更改键的名称然后合并字典也是不可能的,因为字典的数量取决于用户输入,范围从1到104400个创建的字典。

我还尝试了嵌套词典,在尝试访问图片时出现错误“不可散列”。

我想解决我的问题吗?

预先感谢:)。

欢呼

编辑:谢谢大家,您的大多数解决方案都像魅力一样起作用:)

6 个答案:

答案 0 :(得分:6)

通过itertools的力量!

带有字符串键:

>>> from itertools import chain, count
>>> dicts = [d1, d2, d3]
>>> dict(zip(map(str, count(1)), chain.from_iterable((d.values() for d in dicts))))
{'1': 'a1', '2': 'a2', '3': 'a3', '4': 'b1', '5': 'b2', '6': 'b3', '7': 'c1', '8': 'c2', '9': 'c3'}

使用int键:

>>> dict(zip(count(1), chain.from_iterable((d.values() for d in dicts))))
{1: 'a1', 2: 'a2', 3: 'a3', 4: 'b1', 5: 'b2', 6: 'b3', 7: 'c1', 8: 'c2', 9: 'c3'}

尽管后者有点没有意义,因为您可以只使用一个从零开始索引的列表。

请记住,确定性排序的字典需要Python 3.7或更高版本。

答案 1 :(得分:1)

方法如下:

d1 = {'1' : 'a1' , '2' : 'a2' , '3' : 'a3'}

d2 = {'1' : 'b1' , '2' : 'b2' , '3' : 'b3'}

d3 = {'1' : 'c1' , '2' : 'c2' , '3' : 'c3'}

l = [d1, d2, d3]

d_new = {}

i = 1

for d in l:
    for k in d.keys():
        d_new[str(i)] = d[k]
        i += 1

print(d_new)

输出:

{'1': 'a1', '2': 'a2', '3': 'a3', '4': 'b1', '5': 'b2', '6': 'b3', '7': 'c1', '8': 'c2', '9': 'c3'}

如果需要在字符串的两边都加空格:

d1 = {'1' : 'a1' , '2' : 'a2' , '3' : 'a3'}

d2 = {'1' : 'b1' , '2' : 'b2' , '3' : 'b3'}

d3 = {'1' : 'c1' , '2' : 'c2' , '3' : 'c3'}

l = [d1, d2, d3]

d_new = {}

i = 1

for d in l:
    for k in d.keys():
        d_new[f" {i} "] = f" {d[k]} "
        i += 1

print(d_new)

输出:

{' 1 ': ' a1 ', ' 2 ': ' a2 ', ' 3 ': ' a3 ', ' 4 ': ' b1 ', ' 5 ': ' b2 ', ' 6 ': ' b3 ', ' 7 ': ' c1 ', ' 8 ': ' c2 ', ' 9 ': ' c3 '}

答案 2 :(得分:1)

d1 = {'1' : 'a1' , '2' : 'a2' , '3' : 'a3'}
d2 = {'1' : 'b1' , '2' : 'b2' , '3' : 'b3'}
d3 = {'1' : 'c1' , '2' : 'c2' , '3' : 'c3'}

new_dict = {}
key=1
for old_dict in [d1, d2, d3]:

    for v in old_dict.values():
        new_dict[key] = v
        key += 1

答案 3 :(得分:1)

在值上使用itertools.chain(),并将enumerate用作新键的序列:


from itertools import chain


d1 = {'1' : 'a1' , '2' : 'a2' , '3' : 'a3'}
d2 = {'1' : 'b1' , '2' : 'b2' , '3' : 'b3'}
d3 = {'1' : 'c1' , '2' : 'c2' , '3' : 'c3'}


def dict_merge(*dicts):
    return {str(k): v for k, v in enumerate(chain.from_iterable(d.values() for d in dicts), start=1)}


print(dict_merge(d1, d2, d3))

输出:

{'1': 'a1', '2': 'a2', '3': 'a3', '4': 'b1', '5': 'b2', '6': 'b3', '7': 'c1', '8': 'c2', '9': 'c3'}

答案 4 :(得分:1)

假设所有my comment都是这种情况,那么您可以将输入字典作为列表获取。您提到您有从1到104400的任意数量的输入字典,它们都表示图像,因此除了假定输入是任意长度的字典以外,我不会假设您输入的任何内容。

我假设您已经可以将用户输入内容放入列表中,并且我们将此字典列表称为d_list

>>>print(d_list)
>>>[{'1' : 'a1' , '2' : 'a2' , '3' : 'a3'}, {'1' : 'b1' , '2' : 'b2' , '3' : 'b3'}, {'1' : 'c1' , '2' : 'c2' , '3' : 'c3'}]

那么

i = 1  # we're starting counting at 1
d_new = {}
for orig_dict in d_list:
    for val in orig_dict.values():
        d_new[str(i)] = val  # str() as originals had string keys
        i += 1

这应该在对Python 3.6+字典进行排序时起作用,也就是说,他们记住添加项目的顺序。因此,我们可以或多或少地将dict.values()视为列表。

这应该提供您在问题中要求的确切输出。

答案 5 :(得分:1)

from itertools import chain
print({str(k+1):v for (k,v) in enumerate(chain.from_iterable([d.values() for d in [d1,d2,d3] ]))})
{'1': 'a1', '2': 'a2', '3': 'a3', '4': 'b1', '5': 'b2', '6': 'b3', '7': 'c1', '8': 'c2', '9': 'c3'}