如果我使用以下代码,它将创建给定列表的所有置换列表。
def permutation_list(items, i = 0):
if i == len(items):
yield items
else:
for j in range(i, len(items)):
items[i], items[j] = items[j], items[i]
for x in permutation_list(items, i + 1):
yield x
items[i], items[j] = items[j], items[i]
for x in permutation_list([1,2,3,4], i = 0):
print(x)
输出:
[1, 2, 3, 4]
[1, 2, 4, 3]
[1, 3, 2, 4]
[1, 3, 4, 2]
[1, 4, 3, 2]
[1, 4, 2, 3]
[2, 1, 3, 4]
[2, 1, 4, 3]
[2, 3, 1, 4]
[2, 3, 4, 1]
[2, 4, 3, 1]
[2, 4, 1, 3]
[3, 2, 1, 4]
[3, 2, 4, 1]
[3, 1, 2, 4]
[3, 1, 4, 2]
[3, 4, 1, 2]
[3, 4, 2, 1]
[4, 2, 3, 1]
[4, 2, 1, 3]
[4, 3, 2, 1]
[4, 3, 1, 2]
[4, 1, 3, 2]
[4, 1, 2, 3]
但是我想定义一个不同的函数,该函数仅生成特定列表。在我的列表中,有1到n个整数,我想生成一些特定排列列表的列表,该列表满足以下条件。
1)生成的任何两个烫发项的总和应为最小值s(例如s = 3或5)。 e,g如果我们考虑[1,2,3,4]且s = 4,则总和为(1,2)= 3,(2,3)= 5,(3,4)= 7,此处的最小总和是3,小于s = 4。所以我不想产生这个烫发。但是假设[4、1、3、2]的总和为(4,1)= 5,(1,3)= 4,(3,2)= 5,因此最小总和为4。等于s。因此,这是必需的。
2)在任何烫发(列表)中,至少应有r对(例如r = 2或4)对连续项,它们是偶数或奇偶数。 例如在[4、1、3、2]中,奇偶对为(4,1)和(3,2)。 在[9、3、6、8、2、5、1、4、7]中,奇偶对是(3,6),(2,5),(1,4)和(4,7)。 这样的偶数对的最小数目应该是r。
因此,我的函数定义中将有两个变量:
def my_permutation_list(items, m, r, i = 0):
注意:我想在此列表上应用一个for循环,因此它应该是可迭代的。如果我使用 itertools 中的函数 permutations ,它会显示 MemoryError 以获得较大长度的列表。
counter=0
for combi in my_permutation_list(list(range(1,14)), 4, 5, i = 0):
vlh=[] #helper
for i in range(13):
for j in range(13):
if a[i][j] == 1: #a is an two dimensional array
if (combi[i] + combi[j]) != 0 and i>j:
vlh.append(combi[i] + combi[j])
上面是最小的示例。 预先谢谢你。