欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python中的排列-itertools

程序员文章站 2024-02-12 13:22:46
...

itertools.product(*iterables[, repeat])

itertools.product(*iterables[, repeat])
输入迭代的笛卡尔积。(跟顺序有关)

大致相当于生成器表达式中的嵌套for循环。例如,product(A, B)对于A中的x和B中的y返回相同的((x,y))。

嵌套的循环就像一个里程表,在每次迭代中使用最右边的元素。此模式创建一个字典顺序,以便如果输入的迭代器已排序,则产品元组将按排序顺序发出。

要用自身计算迭代器的乘积,请使用可选的repeat关键字参数指定重复的次数。例如,product(A, repeat=4)表示与product(A, A, A, A)相同。

简单的来说就是放置一个可迭代的数列、元组等,然后取中其中的值,repeat决定了每组里面可容纳的元素数量。

def product(*args, repeat=1):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 
    pools = [tuple(pool) for pool in args] * repeat
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

5取2 实现

>>>from itertools import combinations
>>>combins = [c for c in  combinations(range(5), 2)]
>>>len(combins)
10
>>>combins               # 而且是按序排列
[(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

5取2 全排列:

>>>from itertools import permutations
>>>pertumations(range(5), 2)
<itertools.permutations object at 0x0233E360>

>>>perms = permutations(range(5), 2)
>>>perms
[(0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1),
 (2, 3), (2, 4), (3, 0), (3, 1), (3, 2), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3)]
>>>len(perms)
20