pythonic生成对的方法

Dim*_*ima 29 python generator combinatorics

我想要下面的代码,但"pythonic"风格或使用标准库:

def combinations(a,b):
    for i in a:
        for j in b:
             yield(i,j)
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 39

这些都不是真正的在组合的意义上的"组合",这是相当距离的笛卡尔乘积的元素ab.标准库中用于生成这些对的函数是itertools.product():

for i, j in itertools.product(a, b):
    # whatever
Run Code Online (Sandbox Code Playgroud)


Rob*_*Rob 28

正如@Sven所说,你的代码试图获得列表a和列表的所有有序元素对b.在这种情况下itertools.product(a,b)你想要的.相反,如果您真的想要"组合",这些组合都是列表中不同元素的无序对a,那么您需要itertools.combinations(a,2).

>>> for pair in itertools.combinations([1,2,3,4],2):
...    print pair
...
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
Run Code Online (Sandbox Code Playgroud)


Håv*_*ard 7

itertools库有组合数学函数.像Sven所说,itertools.product在这种情况下将是适当的功能:

list(itertools.product('ab', 'cd'))
[('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd')]
Run Code Online (Sandbox Code Playgroud)


mhy*_*itz 7

嵌套的生成器表达式也可以使用:

product = ((i, j) for i in a for j in b)
for i, j in product:
    # ...
Run Code Online (Sandbox Code Playgroud)


fra*_*sua 5

>>>a=[1,2,3]
>>>b=[4,5,6]
>>>zip(a,b)
[(1, 4), (2, 5), (3, 6)] 
Run Code Online (Sandbox Code Playgroud)

  • 好吧,虽然@fransua 得到了-2 反对票,但这正是我作为一对所需要的。我会赞成你的答案。 (2认同)