繁体   English   中英

如何在不“移动”零的情况下生成列表的排列。 在Python中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM