使用 itertools 时如何将字典视为 "whole thing"?

how to treat dictionary as an "whole thing" when using itertools?

from itertools import product

a = [1, 2, 3]
dict1 = {"x": 1, "y": 2, "z": 3}
dict2 = {"r": 4, "s": 5, "t": 6}

for i in product(a, dict1, dict2):
print(i)

我得到了:

(1, 'x', 'r')
(1, 'x', 's')
(1, 'x', 't')
(1, 'y', 'r')
(1, 'y', 's')
(1, 'y', 't')
(1, 'z', 'r')
(1, 'z', 's')
(1, 'z', 't')
(2, 'x', 'r')
(2, 'x', 's')
(2, 'x', 't')
(2, 'y', 'r')
(2, 'y', 's')
(2, 'y', 't')
(2, 'z', 'r')
(2, 'z', 's')
(2, 'z', 't')
(3, 'x', 'r')
(3, 'x', 's')
(3, 'x', 't')
(3, 'y', 'r')
(3, 'y', 's')
(3, 'y', 't')
(3, 'z', 'r')
(3, 'z', 's')
(3, 'z', 't')

但我想得到这些:

(1, {"x": 1, "y": 2, "z": 3}, {"r": 4, "s": 5, "t": 6})
(2, {"x": 1, "y": 2, "z": 3}, {"r": 4, "s": 5, "t": 6})
(3, {"x": 1, "y": 2, "z": 3}, {"r": 4, "s": 5, "t": 6})

我该怎么做?在这种情况下,也许我应该使用另一个函数而不是 product?请帮忙。谢谢!

您请求的输出看起来像您打印了一些元组:

a = [1, 2, 3]
dict1 = {"x": 1, "y": 2, "z": 3}
dict2 = {"r": 4, "s": 5, "t": 6}
for n in a:
    print( (n, dict1, dict2) )

问题是,itertools.product 将 return 提供的可迭代对象的每个元素的所有产品,因此您可以通过将两个字典包装到另一个可迭代对象中来获得与预期结果相似的结果:

for i in list(product(a, [(dict1, dict2)])):
    print(i)

(1, ({'x': 1, 'y': 2, 'z': 3}, {'r': 4, 's': 5, 't': 6}))
(2, ({'x': 1, 'y': 2, 'z': 3}, {'r': 4, 's': 5, 't': 6}))
(3, ({'x': 1, 'y': 2, 'z': 3}, {'r': 4, 's': 5, 't': 6}))

输出与您要求的类似,但字典被包裹在一个元组中。

这类似于您的要求:

a = [1, 2, 3]
dict1 = {"x": 1, "y": 2, "z": 3}
dict2 = {"r": 4, "s": 5, "t": 6}
[[e, dict1, dict2] for e in a]

[[1, {'x': 1, 'y': 2, 'z': 3}, {'r': 4, 's': 5, 't': 6}],
 [2, {'x': 1, 'y': 2, 'z': 3}, {'r': 4, 's': 5, 't': 6}],
 [3, {'x': 1, 'y': 2, 'z': 3}, {'r': 4, 's': 5, 't': 6}]]

需要注意的关键是您实际上只想遍历 a,因为 dict1dict2 只是您正在大量复制的内容。