1.combinations(iterable, r) 创建一个迭代器,返回iterable中所有长度为r的子序列,返回的子序列中的项按输入iterable中的顺序排序:
官方文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
def
combinations(iterable, r):
# combinations('ABCD', 2) --> AB AC AD BC BD CD
# combinations(range(4), 3) --> 012 013 023 123
pool
=
tuple
(iterable)
n
=
len
(pool)
if
r > n:
return
indices
=
range
(r)
yield
tuple
(pool[i]
for
i
in
indices)
while
True
:
for
i
in
reversed
(
range
(r)):
if
indices[i] !
=
i
+
n
-
r:
break
else
:
return
indices[i]
+
=
1
for
j
in
range
(i
+
1
, r):
indices[j]
=
indices[j
-
1
]
+
1
yield
tuple
(pool[i]
for
i
in
indices)
|
def combinations(iterable, r): pool = tuple(iterable) n = len(pool) for indices in permutations(range(n), r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)
例:
>>> list(combinations(range(3),2)) [(0, 1), (0, 2), (1, 2)] >>> list(combinations(range(3),3)) [(0, 1, 2)] >>> list(combinations(range(3),1)) [(0,), (1,), (2,)]
2.product(*iterables[, repeat]) 创建一个迭代器,生成表示iterables中的项目的笛卡尔积的元组,repeat表示重复生成序列的次数。
def product(*args, **kwds): # 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 = map(tuple, args) * kwds.get('repeat', 1) result = [[]] for pool in pools: result = [x+[y] for x in result for y in pool] for prod in result: yield tuple(prod)
例:
>>> list(product(range(3),repeat=1)) [(0,), (1,), (2,)] >>> list(product(range(3),repeat=2)) [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)] >>> list(product(range(3),repeat=3)) [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 2, 0), (0, 2, 1), (0, 2, 2), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 2, 0), (2, 2, 1), (2, 2, 2)]
转载于:https://www.cnblogs.com/yu-zhang/p/3556232.html