如何迭代两个字典并将它们保存在python的列表中

PRK*_*PRK 1 python dictionary list

我试图迭代两个词典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]...] First 这样的值 ,尝试将d值存储在my_listas中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]]
Run Code Online (Sandbox Code Playgroud)

然后,迭代d2并且如果d2存在的密钥my_list然后替换0d2[values]else将其添加到my_listlike [d2[keys], 0, d2[values]].

当我检查'd' in my_list,它给了我FalseTrue'd' in my_list[0][0].

所以,为了获得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])
Run Code Online (Sandbox Code Playgroud)

这给了我错误,

    Traceback (most recent call last):
  File "<pyshell#505>", line 4, in <module>
    my_list[k][2] = d2[j]
KeyError: 2
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

任何人都可以告诉我如何添加键及其值而不在列表中重复?

谢谢

nie*_*mmi 5

您可以分三步形成结果.首先通过创建键的交集来创建包含两个dicts上存在的键的列表.然后添加仅存在于第一个的键,最后添加仅在第二个dict上的键.

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)
Run Code Online (Sandbox Code Playgroud)

输出:

[['b', 3, 5], ['d', 2, 9], ['a', 1, 2], ['c', 6, 0], ['k', 0, 10]]
Run Code Online (Sandbox Code Playgroud)

你可以通过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]]
Run Code Online (Sandbox Code Playgroud)

正如上面提到的@JimDennis只适用于Python 3,因为在Python 2上会keys返回一个列表.这可以通过从返回值构造一个集来缓解:

[[k, d.get(k, 0), d2.get(k, 0)] for k in set(d.iterkeys()) | set(d2.iterkeys())]
Run Code Online (Sandbox Code Playgroud)