我有一个单词列表,我需要以随机顺序排列所有可能的单词对。但约束是 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-loop 作为函数的一部分,如下所示,我基本上会得到无限递归。
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