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 ループ部分を作成すると、基本的に無限再帰が発生します。

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