没有';不要重复python

没有';不要重复python,python,list,python-2.7,permutation,Python,List,Python 2.7,Permutation,Python中有没有一种方法可以生成一个列表的所有排列,而不必获得同一列表的两个副本(由于列表中的元素相同) 例如,列表[“向上”,“向上”]应该只生成列表[“向上”,“向上”],而不是生成两次 另一个示例是[“向上”、“向上”、“向右”]仅返回: ["up", "up", "right"] ["up", "right", "up"] ["right", "up", "up"] 而不是以下内容: ["up", "up", "right"] ["up", "right", "up"] ["rig

Python中有没有一种方法可以生成一个列表的所有排列,而不必获得同一列表的两个副本(由于列表中的元素相同)

例如,列表[“向上”,“向上”]应该只生成列表[“向上”,“向上”],而不是生成两次

另一个示例是[“向上”、“向上”、“向右”]仅返回:

["up", "up", "right"]
["up", "right", "up"]
["right", "up", "up"]
而不是以下内容:

["up", "up", "right"]
["up", "right", "up"]
["right", "up", "up"]
["up", "up", "right"]
["up", "right", "up"]
["right", "up", "up"]
例如,此脚本不提供所需的列表

>>> import itertools
>>> a = list(itertools.permutations(["up","up","down"]))
>>> print a
[('up', 'up', 'down'), ('up', 'down', 'up'), ('up', 'up', 'down'), ('up', 'down', 'up'), ('down', 'up', 'up'), ('down', 'up', 'up')]
注意:对于大小为20或更大的列表,我如何才能更快地执行此操作?

您可以这样做

print list(set(a))
演示:

你可以这么做

print list(set(a))
演示:

您可以获得以下结果的详细信息:

>>> set(itertools.permutations(a))
set([('up', 'up', 'right'), ('right', 'up', 'up'), ('up', 'right', 'up')])
这样可以确保输出中不会出现重复项

当然,您可以使用
list()
将集合转换回列表。

您可以获得以下结果:

>>> set(itertools.permutations(a))
set([('up', 'up', 'right'), ('right', 'up', 'up'), ('up', 'right', 'up')])
这样可以确保输出中不会出现重复项


当然,您可以使用
list()
将集合转换回列表。

这不是Python问题,而是数学问题。(在评论中发现OP不是在列表本身之后,而只是在计数之后。)

如果您有30个插槽需要填充15个“向上”和15个“向下”,那么您需要从30个可能的位置中选择15个不同的位置来放置“向上”,然后其余的位置将被迫“向下”

从30个不同的数字中选择15个是30个选择15,或者30/((15!)*((30-15)!):

我们可以手动检查此表达式以获得较小的列表:

>>> from itertools import permutations
>>> len(set(permutations(["up"]*7+["down"]*3)))
120
>>> factorial(10)/factorial(7)/factorial(10-7)
120

这不是一个Python问题,而是一个数学问题。(在评论中发现OP不是在列表本身之后,而只是在计数之后。)

如果您有30个插槽需要填充15个“向上”和15个“向下”,那么您需要从30个可能的位置中选择15个不同的位置来放置“向上”,然后其余的位置将被迫“向下”

从30个不同的数字中选择15个是30个选择15,或者30/((15!)*((30-15)!):

我们可以手动检查此表达式以获得较小的列表:

>>> from itertools import permutations
>>> len(set(permutations(["up"]*7+["down"]*3)))
120
>>> factorial(10)/factorial(7)/factorial(10-7)
120

有没有办法让这更快?我的列表从30个单元开始,我的代码似乎挂起了,我的cpu使用量也超出了图表。有没有办法让它更快?我的列表从30个单元开始,我的代码似乎挂起了,我的cpu使用量也超出了图表。不,我只需要知道20个上升和20个下降的不同排列。最好的方法是什么?Python已经在42:34.20的时间里一直在努力。必须有更好的方法来做到这一点。我们称之为。显然,你真正的问题是“有多少个不同的元组,有20个上升和20个下降?”——这是一个简单的公式,不需要Python——但你没有问你真正的问题,而是问“如何让创建一个排列的长列表更快?”@DSM公式是什么?你是怎么解出15,15的不同元组的?不,我只需要知道20个上升和20个下降的不同排列。最好的方法是什么?Python已经在42:34.20的时间里一直在努力。必须有更好的方法来做到这一点。我们称之为。显然,你真正的问题是“有多少个不同的元组,有20个上升和20个下降?”——这是一个简单的公式,不需要Python——但你没有问你真正的问题,而是问“如何让创建一个排列的长列表更快?”@DSM公式是什么?你是怎么解15,15的不同元组的?