[英]How to generate increasing permutations of a list in Python without itertools.combinations
How to generate increasing permutations of a list in Python without itertools.combinations: 如何在没有itertools.combinations的情况下在Python中生成列表的递增排列:
I'm trying to create a function that will produce all permutations of a list but limited to only sets of len(n) and only increasing from left to right. 我正在尝试创建一个函数,该函数将生成列表的所有排列,但仅限于len(n)集,并且仅从左向右递增。 For instance, if I have list l = [2,4,5,7,9] and n=4, the results should include [2,4,5,7], [2,4,7,9], [2,5,7,9] but not [9,7,4,2], [9,4,7,2].
例如,如果我有列表l = [2,4,5,7,9]且n = 4,则结果应包括[2,4,5,7],[2,4,7,9],[ 2,5,7,9],但没有[9,7,4,2],[9,4,7,2]。 This is what I have done so far:
到目前为止,这是我所做的:
def permutation(lst):
if len(lst) == 0:
return []
if len(lst) == 1:
return [lst]
l = []
for i in range(0, len(lst)):
m = lst[i]
new = lst[:i] + lst[i+1:]
for p in permutation(new):
l.append([m] + p)
return l
test: 测试:
data = list([1,2,3,4,5,6])
for p in permutation(data):
print p
What you're describing is exactly what itertools.combinations
does: 您所描述的正是
itertools.combinations
作用:
from itertools import combinations
l = [2,4,5,7,9]
n = 4
for c in combinations(l, n):
print(list(c))
This outputs: 输出:
[2, 4, 5, 7]
[2, 4, 5, 9]
[2, 4, 7, 9]
[2, 5, 7, 9]
[4, 5, 7, 9]
But if you do not want to actually use itertools.combinations
, you can refer to how it can be implemented in Python in the documentation : 但是,如果您不想实际使用
itertools.combinations
,可以在文档中参考如何在Python中实现它:
def combinations(iterable, r):
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = list(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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.