![](/img/trans.png)
[英]How to generate increasing permutations of a list in Python without itertools.combinations
[英]How to generate permutations of a list without “moving” zeros. in Python
使用itertools
工具,我可以对给定的数字列表进行所有可能的排列,但是如果列表如下:
List=[0,0,0,0,3,6,0,0,5,0,0]
itertools
不“知道”迭代零是浪费的工作,例如,以下迭代将出现在结果中:
List=[0,3,0,0,0,6,0,0,5,0,0]
List=[0,3,0,0,0,6,0,0,5,0,0]
它们是相同的,但是itertools
仅取第一个零(例如),并将其移至列表的第四位,反之亦然。
问题是:我怎样才能仅迭代某些选定的数字,而让其他数字(如零)不予处理? 可以有或没有itertools
。
Voilá-它现在可以工作-在获得“肉”的排列后,我进一步获得了“ 0”位置的所有可能组合,并为非0的每个排列对“ 0位置”的每个可能集合产生了一个排列:
from itertools import permutations, combinations
def permut_with_pivot(sequence, pivot=0):
pivot_indexes = set()
seq_len = 0
def yield_non_pivots():
nonlocal seq_len
for i, item in enumerate(sequence):
if item != pivot:
yield item
else:
pivot_indexes.add(i)
seq_len = i + 1
def fill_pivots(permutation):
for pivot_positions in combinations(range(seq_len), len(pivot_indexes)):
sequence = iter(permutation)
yield tuple ((pivot if i in pivot_positions else next(sequence)) for i in range(seq_len))
for permutation in permutations(yield_non_pivots()):
for filled_permutation in fill_pivots(permutation):
yield filled_permutation
(我使用了Python的3个“非本地”关键字-如果您仍在使用Python 2.7,则必须采取另一种方法,例如使seq_len
成为一个包含单个项目的列表,然后可以将其替换在内部函数上)
我的第二次尝试 (实际上是第三次)
这是一种幼稚的方法,仅保留已“看到”的排列的缓存-它节省了对每个排列所做的工作,但没有生成所有可能的排列的工作:
from itertools import permutations
def non_repeating_permutations(seq):
seen = set()
for permutation in permutations(seq):
hperm = hash(permutation)
if hperm in seen:
continue
seen.add(hperm)
yield permutation
将每个结果附加到列表。 现在,您将拥有每种可能的组合,然后执行以下操作:
list(set(your_big_list))
Set会将列表缩小到仅唯一排列。 我不能完全确定这是您要解决的问题还是担心性能。 不管刚做一个帐户,我都想贡献一点
您的问题尚不清楚,但是如果您尝试列出排列而输出中没有0
,则可以按以下方式进行操作:
from itertools import permutations
def perms( listy ):
return permutations( [i for i in listy if i!=0])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.