在 Python 中获取排列,itertools

Posted

技术标签:

【中文标题】在 Python 中获取排列,itertools【英文标题】:Getting permutations in Python, itertools 【发布时间】:2012-08-07 06:09:07 【问题描述】:

我想使用 itertools 从字母表中的每个字母中获取所有可能的 3 个字母排列。回到空白:

import itertools 

def permutations(ABCDEFGHIJKLMNOPQRSTUVWXYZ, r=3):
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    for indices in product(range(n), repeat=r):
        if len(set(indices)) == r:
            yield tuple(pool[i] for i in indices)

我做错了什么?

【问题讨论】:

iterable 在哪里定义?请包含语法上有效的代码 我只是想从文档中学习,docs.python.org/library/itertools 就是这么说的。 这不是它所说的你已经改变了它。这也只是解释 permutations 做什么的代码 iterable 是一个变量名。除非你给它赋值,否则它没有任何意义。 【参考方案1】:

您有点搞混了,这只是解释permutations 作用的代码。 itertools 实际上是用 C 代码编写的,python equivalent 只是为了展示它是如何工作的。

>>> from itertools import permutations
>>> from string import ascii_uppercase
>>> for x in permutations(ascii_uppercase, r=3):
        print x


('A', 'B', 'C')    
('A', 'B', 'D')
('A', 'B', 'E')    
('A', 'B', 'F')
.....

应该没问题

【讨论】:

【参考方案2】:

itertools.permutations 文档中的代码解释了函数是如何实现的,而不是如何使用它。你想这样做:

perms = itertools.permutations('ABCDEFGHIJKLMNOPQRSTUVWXYZ', r=3)

您可以通过将其转换为列表 (print(list(perms))) 将它们全部打印出来,但如果您想对它们执行其他操作,则可以在 for 循环中迭代它们 - 例如,

for perm in perms:
    ...

【讨论】:

非常感谢!如果我遍历它们,它将使用 ABC 还是 (A,B,C)? @lvc 我有一个非常庞大的 csv 列表,可以从 r = 6 中找到排列,但我得到了缺少内存错误。你建议我如何克服这个问题?

以上是关于在 Python 中获取排列,itertools的主要内容,如果未能解决你的问题,请参考以下文章

用于重新排列列表的 Python 标准库函数

Python排列组合的计算方法

如何在 Firebase 中按降序排列数据 - Python

Leetcode练习(Python):数组类:第31题:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列

LeetCode 31. 下一个排列 | Python

LeetCode 31. 下一个排列 | Python