如何获取两个列表之间的所有映射?
Posted
技术标签:
【中文标题】如何获取两个列表之间的所有映射?【英文标题】:How to get all mappings between two lists? 【发布时间】:2014-04-14 10:42:25 【问题描述】:我们有两个列表,A 和 B:
A = ['a','b','c']
B = [1, 2]
有没有一种 Python 的方法来构建 A 和 B 之间包含 2^n(这里 2^3=8)的所有映射集?那就是:
[(a,1), (b,1), (c,1)]
[(a,1), (b,1), (c,2)]
[(a,1), (b,2), (c,1)]
[(a,1), (b,2), (c,2)]
[(a,2), (b,1), (c,1)]
[(a,2), (b,1), (c,2)]
[(a,2), (b,2), (c,1)]
[(a,2), (b,2), (c,2)]
使用itertools.product
,可以获得所有的元组:
import itertools as it
P = it.product(A, B)
[p for p in P]
这给出了:
Out[3]: [('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1), ('c', 2)]
【问题讨论】:
【参考方案1】:您可以使用 itertools.product
和 zip
执行此操作
from itertools import product
print [zip(A, item) for item in product(B, repeat=len(A))]
输出
[[('a', 1), ('b', 1), ('c', 1)],
[('a', 1), ('b', 1), ('c', 2)],
[('a', 1), ('b', 2), ('c', 1)],
[('a', 1), ('b', 2), ('c', 2)],
[('a', 2), ('b', 1), ('c', 1)],
[('a', 2), ('b', 1), ('c', 2)],
[('a', 2), ('b', 2), ('c', 1)],
[('a', 2), ('b', 2), ('c', 2)]]
product(B, repeat=len(A))
产生
[(1, 1, 1),
(1, 1, 2),
(1, 2, 1),
(1, 2, 2),
(2, 1, 1),
(2, 1, 2),
(2, 2, 1),
(2, 2, 2)]
然后我们从产品中挑选每个元素并使用A
压缩它,以获得您想要的输出。
【讨论】:
【参考方案2】:import itertools as it
A = ['a','b','c']
B = [1, 2]
for i in it.product(*([B]*len(A))):
print(list(zip(A, i)))
输出:
[('a', 1), ('b', 1), ('c', 1)]
[('a', 1), ('b', 1), ('c', 2)]
[('a', 1), ('b', 2), ('c', 1)]
[('a', 1), ('b', 2), ('c', 2)]
[('a', 2), ('b', 1), ('c', 1)]
[('a', 2), ('b', 1), ('c', 2)]
[('a', 2), ('b', 2), ('c', 1)]
[('a', 2), ('b', 2), ('c', 2)]
不确定它是否非常pythonic,如果你看it.product(*([B]*len(A)))
,因为它使用了多种python特定的语言特性。但它实际上太神秘了,无法成为 Pythonic... B 根据 A 的长度重复 n 次并解包到产品函数中。
【讨论】:
以上是关于如何获取两个列表之间的所有映射?的主要内容,如果未能解决你的问题,请参考以下文章
Java 8 LocalDateTime - 如何获取两个日期之间的所有时间