如何在给定N个项目的列表中生成长度为LEN的排列?

32

注意:我正在使用Python编写代码。

例如,给定一个列表:

list = ['a','b','c','d','e','f','g','h','i','j']

我想生成一个包含所有可能的三项组合的列表:

['a','b','c'],
['a','b','d'],
['a','b','e']

排列中不应该重复使用同一个项目,但顺序很重要,代表着应该包括的不同排列,例如:

['a','b','c'],
['a','c','b']

应该都包括在内。

我正在寻找生成排列的“3”是神奇长度,但我不会否认任意长度排列的解决方案。

感谢任何帮助!


2
你有没有考虑过这个问题?你是否遇到了瓶颈? - simchona
3
我不想说,但是在谷歌上搜索“Python列表排列”会得到http://docs.python.org/library/itertools.html。 - simchona
别人已经回答过了,但是是的,我曾经考虑过这个问题,但在与此相关的项目的其他方面之后,我的大脑进入了锁定状态,无法想到除了一个有很多丑陋部分的暴力方法以外的其他方法。 - Odj fourth
4个回答

36
itertools.permutations(my_list, 3)

19

假设你在使用Python 2.6或更新版本:

from itertools import permutations
for i in permutations(your_list, 3):
    print i

13

如果您需要获取长度为n的列表中所有组合,其中n可能大于列表元素的数量,并且允许重复元素:

如果您需要获取长度为n的列表中所有组合,其中n可能大于列表元素的数量,并且允许重复元素:

import itertools
list(itertools.product([-1,1], repeat=3))
< p > [(-1,-1,-1),(-1,-1,1),(-1,1,-1),(-1,1,1),(1,-1,-1),(1,-1,1),(1,1,-1),(1,1,1)]

想象一个笛卡尔积,如[-1,1] x [-1,1] x [-1,1]


4

您应该使用itertools模块中的permutations函数。

>>> import itertools
>>> lst = ['a','b','c','d','e','f','g','h','i','j']
>>> itertools.permutations(lst, 3)

如果您真的想要获取组合,那么可以使用combinations函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接