我有一个单词列表,我需要所有可能的随机顺序对。但是约束是对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