Python组合和置换代码
我有以下代码来生成组合集、在列表中追加组合以及返回列表Python组合和置换代码,python,combinations,itertools,Python,Combinations,Itertools,我有以下代码来生成组合集、在列表中追加组合以及返回列表 def make_combination(): import itertools max_range = 5 indexes = combinations_plus = [] for i in range(0, max_range): indexes.append(i) for i in xrange(2, max_range): each_combination = [list(x)
def make_combination():
import itertools
max_range = 5
indexes = combinations_plus = []
for i in range(0, max_range):
indexes.append(i)
for i in xrange(2, max_range):
each_combination = [list(x) for x in itertools.combinations(indexes, i)]
combinations_plus.append(each_combination)
retrun combinations_plus
它生成了太多我不想要的组合(难以显示)。但是,我想要以下组合:
1) [0,1]、[0,2]、[0,3]、[0,4]、[1,2]、[1,3]、[1,4]、[2,3]、[2,4]、[3,4]]
2) [0,1,2]、[0,1,3]、[0,1,4]、[0,2,3]、[0,2,4]、[0,3,4]、[1,2,3]、[1,2,4]、[1,3,4]、[2,3,4]]
3) [0,1,2,3],[0,1,2,4],[0,1,3,4],[0,2,3,4],[1,2,3,4]]
我认为问题在下面几行,但我不知道是什么。知道错误是什么吗
combinations_plus.append(each_combination)
做你想做的事情的一个简单方法是:
list(list(itertools.combinations(list(range(5)), i)) for i in range(2, 5))
要修复原始代码,有两个问题:
indexes = combinations_plus = []
上面为完全相同的列表创建了两个名称。附加到任何一个都会附加到两个,这不是您想要的
不应嵌套的两个,或者索引列表不完整:
for i in range(0, max_range):
indexes.append(i)
for i in xrange(2, max_range):
each_combination = [list(x) for x in itertools.combinations(indexes, i)]
combinations_plus.append(each_combination)
实际上,使用范围初始化索引,并跳过循环的第一个:
indexes = range(max_range) # becomes [0,1,2,3,4]
combinations_plus = []
通过这些修复(以及修复return
的拼写),您可以:
def make_combination():
import itertools
max_range = 5
indexes = range(max_range)
combinations_plus = []
for i in xrange(2, max_range):
each_combination = [list(x) for x in itertools.combinations(indexes, i)]
combinations_plus.append(each_combination)
return combinations_plus
返回(为可读性添加了换行符):
它生成哪些组合是您不想要的?您如何确定您想要哪些组合?尝试使用调试器。它将帮助您发现自己的错误。我使用以下代码组合附加每个组合后,它将生成所有组合。\u plus.append(每个\u组合)。我不想要所有的组合。我想要分别的组合C(N,2)、C(N,3)、C(N,4)和C(N,5)。我想要每个组合都放在列表中。index=combinations\u plus=[]
-这和你想象的不一样。索引
和组合_plus
是同一个列表。不是两个空列表。一个空列表有两个名称。对索引
所做的任何事情都会发生在组合_plus
上,因为它们是相同的东西。这看起来不更短吗?[list](itertools.compositions(range(5),i))for i in range(2,5)]
非常感谢@Mark Tolonen。没有选项可以使这两个答案都正确。我还希望单击此选项以确认正确。
[[[0, 1], [0, 2], [0, 3], [0, 4], [1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]],
[[0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 2, 3], [0, 2, 4], [0, 3, 4], [1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]],
[[0, 1, 2, 3], [0, 1, 2, 4], [0, 1, 3, 4], [0, 2, 3, 4], [1, 2, 3, 4]]]