ランダムな順序で可能なすべてのペアが必要な単語のリストがあります。ただし、ペア 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