[英]How to iterate over two dictionaries and save them in a list in python
我正在尝试迭代两个字典d = {'d': 2, 'c': 6, 'a': 1, 'b': 3}
和d2 = {'j': 9, 'b': 5, 'a': 2, 'k': 10}
。 它应该存储[[key1, value1 value2], [key1, value1, value2], [key2, value1, value2]...]
首先,尝试将d
值存储在my_list
如my_list = [d[keys], d[values], 0]
。
我的代码如下
my_list = []
for i, j in d.items():
if i in my_list:
print(i, "is in list")
else:
my_list.append([i,j,0])
output: my_list = [['d', 2, 0], ['c', 6, 0], ['a', 1, 0], ['b', 3, 0]]
然后,遍历d2
,如果关键d2
中存在my_list
然后替换0
与d2[values]
别人把它添加到my_list
像[d2[keys], 0, d2[values]]
。
当我'd' in my_list
选中'd' in my_list
,它为'd' in my_list[0][0]
提供了False
和True
。
因此,为了获得my_list[0][0]
位置,我使用了另一个for loop
,例如
for k in range(len(d2)):
for i, j in d2.items():
if i in my_list[k][0]:
my_list[k][2] = d2[j]
else:
my_list.append([i,0,j])
这给了我错误
Traceback (most recent call last):
File "<pyshell#505>", line 4, in <module>
my_list[k][2] = d2[j]
KeyError: 2
我在这里想念的是什么?
谁能告诉我如何在不复制列表的情况下添加键及其值?
谢谢
您可以通过三个步骤来形成结果。 首先,通过创建键的交集,创建包含两个字典中都存在的键的列表。 然后添加仅在第一个字典中存在的键,最后添加仅在第二个字典中存在的键。
d = {'d': 2, 'c': 6, 'a': 1, 'b': 3}
d2 = {'d': 9, 'b': 5, 'a': 2, 'k': 10}
result = [[k, d[k], d2[k]] for k in d.keys() & d2.keys()]
result.extend([k, d[k], 0] for k in d if k not in d2)
result.extend([k, 0, d2[k]] for k in d2 if k not in d)
print(result)
输出:
[['b', 3, 5], ['d', 2, 9], ['a', 1, 2], ['c', 6, 0], ['k', 0, 10]]
您也可以使用union和dict.get
做到这一点:
>>> d = {'d': 2, 'c': 6, 'a': 1, 'b': 3}
>>> d2 = {'d': 9, 'b': 5, 'a': 2, 'k': 10}
>>> [[k, d.get(k, 0), d2.get(k, 0)] for k in d.keys() | d2.keys()]
[['k', 0, 10], ['c', 6, 0], ['d', 2, 9], ['a', 1, 2], ['b', 3, 5]]
正如@JimDennis所述,以上仅适用于Python 3,因为在Python 2上, keys
返回一个列表。 通过从返回值构造一个集合可以减轻这种情况:
[[k, d.get(k, 0), d2.get(k, 0)] for k in set(d.iterkeys()) | set(d2.iterkeys())]
这会做
d = {'d': 2, 'c': 6, 'a': 1, 'b': 3}
d2 = {'j': 9, 'b': 5, 'a': 2, 'k': 10}
list=[]
for key,value in d.iteritems():
if key in d2:
list.append([key,d[key],d2[key]])
else:
list.append([key,d[key],0])
for key,value in d2.iteritems():
if key not in d:
list.append([key,0,d2[key]])
print list
输出:
[['a', 1, 2], ['c', 6, 0], ['b', 3, 5], ['d', 2, 0], ['k', 0, 10], ['j', 0, 9]]
以下作品:
l=[] #store desired output
#go through elements of First dictionary (d1)
for key,val in d1.items():
try:
#create the list and pop the element in d2 that matched with key of d1
temp = [key,val,d2.pop(key)]
except:
temp = [key,val,0]
l.append(temp)
#print(l)
#[['d', 2, 9], ['c', 6, 0], ['a', 1, 2], ['b', 3, 5]]
#d2 may have elements left, go through them
for key,val in d2.items():
temp=[key,0,val]
l.append(temp)
print(l)
#驱动程序值
IN : d1= {'d': 2, 'c': 6, 'a': 1, 'b': 3}
IN : d2 = {'d': 9, 'b': 5, 'a': 2, 'k': 10}
OUT: [['d', 2, 9], ['c', 6, 0], ['a', 1, 2], ['b', 3, 5], ['k', 0, 10]]
Python中的字典键是集合(在数学意义上)。 在Python3中,它们的设置类似于对象,并且可以与Python的set运算符一起使用。
在早期版本的Python中,字典.keys()方法返回一个列表,并且必须将其显式转换为set()才能在其上使用set运算符/方法。
因此,满足您的要求的简单功能很简单:
def merge_dicts_to_list(this, that):
common = set(this.keys()) & set(that.keys())
these = set(this.keys()) - set(that.keys())
those = set(that.keys()) - set(this.keys())
results = [[k, this[k], that[k]] for k in common]
results.extend([[k, this[k]] for k in these])
results.extend([[k, that[k]] for k in those])
return results
我会同意“ this”和“ that”……“ these”和“ these”不是最受启发的变量名(“ left”和“ right”可能更传统。“ d”和“ d1”是难以阅读)。
这个例子是故意冗长的。 我最初将其写成三行,但认为这些集合表达式的复杂性更难阅读和推理。 这样就应该很清楚了。 交集是共有的键,每种方式的集合不同,它们给出的键只能在一个或另一个中找到; 我们只需使用这些键集构建一个列表列表。
总的来说,程序员忘记集合和集合运算符实在是太普遍了。 然后,他们最终重新实现代码以执行这些操作,从而创建了更多要维护的代码,为自己的错误提供了更多机会,并且错过了使用其语言内置功能可能带来的性能优势。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.