结合两个dicts的最佳方法,合并第一个值和第二个键

时间:2015-09-27 13:33:51

标签: python

我有两个词:

a = {"foo":["bar","baz"]}
b = {"bar":[1,2],"baz":[9,10]}

我想合并它们,以便a("bar""baz")的值中的每个元素都被b中的值替换,"bar"和{{1}是键。

期望的输出:

"baz"

这就是我目前正在实施合并的方式:

{'foo': [[1, 2], [9, 10]]}

有更好的方法吗?

另外:不确定这是否适合在同一篇文章中提问,但我也想通过pyspark学习一种方法。

2 个答案:

答案 0 :(得分:2)

你可以简单地使用列表理解:

a['foo'] = [b[el] for el in a['foo']]

答案 1 :(得分:0)

简单高效的Martijn Pieters ......

我们有一个初学者,所以我会引起对可变集合的关注。

如果b中的列表在下面的代码中被修改,a也将被修改。

a = {"foo": ["bar", "baz"]}
b = {"bar": [1, 2], "baz": [9, 10]}

a['foo'] = [b[el] for el in a['foo']]

expected = {'foo': [[1, 2], [9, 10]]}
assert a == expected

示例:

b["bar"][0] = 789
print(a)
assert a == expected  # AssertionError

你得到:

{'foo': [[789, 2], [9, 10]]}

为避免这种情况,可以使用list()构造函数或[:]语法复制列表:

a['foo'] = [list(b[el]) for el in a['foo']]
# or: a['foo'] = [b[el][:] for el in a['foo']]

expected = {'foo': [[1, 2], [9, 10]]}
assert a == expected

b["bar"][0] = 789
print(a)
assert a == expected  # OK

如果您真的是偏执狂,可以使用copy.deepcopy

import copy

a['foo'] = [copy.deepcopy(b[el]) for el in a['foo']]

expected = {'foo': [[1, 2], [9, 10]]}
assert a == expected

b["bar"][0] = 789
print(a)
assert a == expected  # OK