python - 如何生成没有 “moving” 零的列表的排列。在 Python 中

标签 python list permutation

使用 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”位置和 yield 的所有可能组合 每个排列的每组可能的“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 个“nonlocal”关键字——如果你还在使用 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

关于python - 如何生成没有 “moving” 零的列表的排列。在 Python 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37727469/

相关文章:

python - Python 2.7 中平台特定的 Unicode 语义

python - 将字符串列表转换为整数列表

list - 从行分隔的输出中获取列表

c# - 即使在 ".ToList()"调用之后,递归中的 yield 返回也不会返回值

c++ - 使用结构的成员变量来比较 next_permutation()

python - 如何使用 plt.savefig 正确显示足够的刻度标记?

python - 如何保持 numpy 数组的精度

python - Django ListField 具有添加和删除功能

c++ - 读取 txt 文件并将值放入列表中 (c++)

python - 生成相同项目索引的排列