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