如何生成特定列表以代替所有排列的列表

时间:2020-05-07 13:02:48

标签: python list generator permutation iterable

如果我使用以下代码,它将创建给定列表的所有置换列表。

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])

上面是最小的示例。 预先谢谢你。

0 个答案:

没有答案
相关问题