我有一个关于合并两个字典的问题。这不是一个简单的合并,而是以一种方式进行合并,我将从第一个元素中取出第一个键值对,然后从第二个字典中取出第一个元素,以此类推。例如:
dict1 = {"zero":0,"two":2, "four":4, "six": 6, "eight":8,"ten":10}
dict2 = {"one":1,"three":3,"five":5,"seven":7, "nine":9}
我需要以下内容:
dict3 ={"zero" 0,"人的:1、"two": 2,"three": 3,"four": 4,……"ten" 10}
非常感谢您的建议
@Andrei Vintila的回答是正确的,但是dict_keys是不可下标的,使用最小的大小会丢失一些字典项。一种有效的循环方法(对于任意数量的元素)是:
dict1_keys = list(dict1.keys())
dict2_keys = list(dict2.keys())
s1 = len(dict1_keys)
s2 = len(dict2_keys)
max_size = max(s1, s2)
dict3 = {}
for index in range(max_size):
if(index < s1):
key1 = dict1_keys[index]
dict3[key1] = dict1[key1]
if(index < s2):
key2 = dict2_keys[index]
dict3[key2] = dict2[key2]
print(dict3)
生产:
{'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9, 'ten': 10}
您需要再创建一个字典,它将合并其他两个字典,之后我们只需要对新的字典项进行排序。下面是代码:
dict1 = {"zero":0,"two":2, "four":4, "six": 6, "eight":8,"ten":10}
dict2 = {"one":1,"three":3,"five":5,"seven":7, "nine":9}
dict3 = {**dict1, **dict2}
dict3 = dict(sorted(dict3.items(), key=lambda x:x[1]))
print(dict3)
如果你使用的是python 3.7+,那么字典会保持插入顺序。
dict1_keys = dict1.keys()
dict2_keys = dict2.keys()
你要做的是你必须获得第一个和第二个字典的键,并使用索引循环它们,一旦你用尽了一个字典的键,而另一个字典中还有键,那么你只需要复制剩下的键和值。
smallest_size = min(len(dict1_keys), len(dict2_keys))
for index in range(smallest_size):
key1 = dict1_keys[index]
key2 = dict2_keys[index]
dict3[key1] = dict1[key1]
dict3[key2] = dict2[key2]
我知道这可能不是Python解决这个问题的方法,但是如果你正在复习,这是一种方法…
如果你想要一个简单的循环方法,关键是使用enumerate
来获得一个索引,你可以使用它来访问第二个dict
(并检查你没有跑掉第二个字典的末尾-我假设这里第二个字典是相同的长度或短一个):
dict1 = {"zero":0,"two":2, "four":4, "six": 6, "eight":8,"ten":10}
dict2 = {"one":1,"three":3,"five":5,"seven":7, "nine":9}
result = {}
keys2 = list(dict2.keys())
for i, k in enumerate(dict1):
result[k] = dict1[k]
if i < len(dict2):
result[keys2[i]] = dict2[keys2[i]]
如果你想要一个更实用的方法,你可以这样做:
from functools import reduce
result = reduce(dict.__or__, ({k1: v1, k2: v2} for (k1, v1), (k2, v2) in zip(dict1.items(), dict2.items())))
如果两个字典长度相同,可以正常工作。如果第二个比较短,则需要手动将第一个字典中剩余的键值附加在
之后。使用zip()
进行简单迭代。然而,zip()
只返回iterable的最短参数。在这种情况下,最长字典的最后一个key:值将不包括在内。dict.update()
将更新字典以确保添加了所有键和值:
dict1 = {"zero":0,"two":2, "four":4, "six": 6, "eight":8,"ten":10}
dict2 = {"one":1,"three":3,"five":5,"seven":7, "nine":9, "eleven":11, "twelve":12}
dict3 = {}
for k1, k2 in zip(dict1, dict2):
dict3[k1], dict3[k2] = k1, k2
dict3.update(dict1); dict3.update(dict2)
print(dict3)
# {'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9, 'ten': 10, 'eleven': 11, 'twelve': 12}
所以字典不像列表那样是序列(尽管字典是"有序的")。从3.7开始,在大多数情况下顺序无关紧要)。collection模块
中有一个有序字典有几种方法来组合字典
在你的情况下最简单的方法是.update()
,所以:
dict1.update(dict2)
将所有的键/值对合并到一个字典
也可以使用kwargs:
dict3 = {**dict1, **dict2}
如果你仍然希望它们排序,你可以使用sorted
与不同的功能
sorted(dict3,key=[insert]) # note can also use reverse=True
不同的关键功能:str
:如果一个递增的名称,如a,b,c等lamda x: dict3[x]
:如果增加值如0、1、2、3等
也可以创建一个键列表并从中进行搜索(虽然有点粗糙)
key_list =[]
#Note only works if len(dict1) = len(dict2)
for item1, item2 in zip(dict1,dict2):
key_list.extend([item1,item2])
然后输入key=lambda x: key_list.index(x)
希望这对你有帮助!