所有可能对的随机列表,对N不能具有来自对N-1的任一个字

时间:2013-11-05 16:38:00

标签: python permutation

我有一个单词列表,我需要所有可能的随机顺序对。但是约束是对N不能具有来自对N-1的任何一个字。为了便于解释,我用数字替换了单词。

import itertools  
import random

a = [1, 2, 3, 4, 5, 6]
c = list(itertools.permutations(a, 2))

random.shuffle(c)

for i in range(len(c)):
    if i == 0 or i > (len(c)-3): 
        continue
    else:
        if c[i][0] == c[i-1][0] or c[i][0] == c[i-1][1] or c[i][1] == c[i-1][0] or c[i][1] == c[i-1][1]:
            c.insert(i+10, c.pop(i))
        else:
            continue

我想出了一个非常不优雅和不完整的解决方案。我在追求这种方法时遇到的问题是:它只迭代列表一次。因此,如果来自c [i]的任一数字与c [i-1]匹配,则c [i]在列表中进一步向下弹出,但是新的c [i]不会被评估以检查相同的问题。 2.如果我创建函数的for循环部分,如下所示,我基本上得到无限递归。

def shuffler(a): 
    for i in range(a,len(c)):
        if i == 0 or i > (len(c)-3): 
            continue
        else:
            if c[i][0] == c[i-1][0] or c[i][0] == c[i-1][1] or c[i][1] == c[i-1][0] or c[i][1] == c[i-1][1]:
                c.insert(i+10, c.pop(i))
                shuffler(i)
            else:
                continue

对不起 - 找到解决方案:

import itertools  
import random

a = [1, 2, 3, 4, 5, 6]
c = list(itertools.permutations(a, 2))

random.shuffle(c)



def checker():
    if c[i][0] == c[i-1][0] or c[i][0] == c[i-1][1] or c[i][1] == c[i-1][0] or c[i][1] == c[i-1][1]:
        c.insert(i+10, c.pop(i))
        checker()

for i in range(len(c)):
    if i == 0 or i > (len(c)-3): 
        continue
    else:
        checker()

print c 

0 个答案:

没有答案