1

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

0 回答 0