9

次の2つのリストがあります。

l1 = [1, 2, ,3]  
l2 = [x, y]  

そして、5つの要素のすべてのリストを次の順序で保持したいと考えていますl1。言う:

[x, y, 1, 2, 3],  
[x, 1, y, 2, 3],  
[x, 1, 2, y, 3],  
[x, 1, 2, 3, y],  
[y, x, 1, 2, 3],  
[y, 1, x, 2, 3],  
[y, 1, 2, x, 3],  
[y, 1, 2, 3, x],  
[1, x, y, 2, 3],  
[1, x, 2, y, 3],  
[1, x, 2, 3, y],  
[1, y, x, 2, 3],  
[1, y, 2, x, 3],  
[1, y, 2, 3, x],  
...  
[1, 2, 3, y, x],  
...  
[1, 2, 3, x, y]  

の順序l1は重要であり、そうでl2はないことに注意してください。要素は l1+l2 の位置にまたがりますが、重要なl2のは順序だけです。l1私はこれに苦労しています。どんな助けでも大歓迎です。

4

5 に答える 5

4

これを行う 1 つの方法は、 を使用itertools.combinationsして、 の要素を配置する最終的なリストのインデックスを選択することですl1。次に、これらの選択肢のそれぞれについて、 を使用itertools.permutationsして、2 番目のリスト内の項目のすべての順列を検索します。次に、これらのリストの両方を調べて、インデックスがl1またはの要素のインデックスであるかどうかに応じて、いずれかの先頭を選択しl2ます。

from itertools import combinations, permutations

l1 = [1, 2, 3]
l2 = ["x", "y"]

n = len(l1) + len(l2)

for c in combinations(range(0, n), len(l1)):
    cs = set(c)
    for p in permutations(l2):
        l1i = iter(l1)
        l2i = iter(p)
        print [ l1i.next() if i in cs else l2i.next() for i in range(0,n) ]

出力は次のようになります。

[1, 2, 3, 'x', 'y']
[1, 2, 3, 'y', 'x']
[1, 2, 'x', 3, 'y']
[1, 2, 'y', 3, 'x']
[1, 2, 'x', 'y', 3]
[1, 2, 'y', 'x', 3]
[1, 'x', 2, 3, 'y']
[1, 'y', 2, 3, 'x']
[1, 'x', 2, 'y', 3]
[1, 'y', 2, 'x', 3]
[1, 'x', 'y', 2, 3]
[1, 'y', 'x', 2, 3]
['x', 1, 2, 3, 'y']
['y', 1, 2, 3, 'x']
['x', 1, 2, 'y', 3]
['y', 1, 2, 'x', 3]
['x', 1, 'y', 2, 3]
['y', 1, 'x', 2, 3]
['x', 'y', 1, 2, 3]
['y', 'x', 1, 2, 3]
于 2012-05-18T15:41:40.583 に答える
4

これを散在する l1 と (l2 の順列) と呼びます。これは 2 つの手順で行うことができます: 位置を選択してから、位置を並べ替えます。挿入ポイントには、マスク ベースのアプローチ ( permutations([True,True,False,False,False])) またはインデックス ベースのアプローチ ( ) を使用できますproduct(*[range(5)]*2)。後者の手法はまだ機能していません。

from itertools import *

def interspersings(l1,l2):
    for mask in set(permutations([0]*len(l1) + [1]*len(l2))):  # sadly inefficient
        iters = [iter(l1), iter(l2)]
        yield [next(iters[which]) for which in mask]

for perm in permutations(l2):
    for interspersing in interspersings(l1,perm):
        print(interspersing)

デモ:

[1, 2, 'x', 'y', 3]
['x', 'y', 1, 2, 3]
[1, 2, 'x', 3, 'y']
[1, 2, 3, 'x', 'y']
['x', 1, 'y', 2, 3]
[1, 'x', 'y', 2, 3]
[1, 'x', 2, 'y', 3]
['x', 1, 2, 'y', 3]
[1, 'x', 2, 3, 'y']
['x', 1, 2, 3, 'y']
[1, 2, 'y', 'x', 3]
['y', 'x', 1, 2, 3]
[1, 2, 'y', 3, 'x']
[1, 2, 3, 'y', 'x']
['y', 1, 'x', 2, 3]
[1, 'y', 'x', 2, 3]
[1, 'y', 2, 'x', 3]
['y', 1, 2, 'x', 3]
[1, 'y', 2, 3, 'x']
['y', 1, 2, 3, 'x']

編集:ああ、私が言及した後者の手法は、 https: //stackoverflow.com/a/10655695/711085 で Mark Longair によって正しく実装されました(この手法よりもはるかに効率的です) 。

于 2012-05-18T15:48:52.057 に答える
1

これにアプローチするより良い方法の 1 つは、[1,2,3] をそのままにして、「x」について、挿入できる場所が 4 つあることを認識することです (「1」の前、「1」の前)。 '2', ... '3' の後)。次に、「x」が挿入されると、「y」を挿入する場所が 5 つになります (「x」が挿入されなかった 3 つの場所と、「x」の前と「x」の後に加えて)。ネストされたループを使用して、考えられる各位置に「x」と「y」を挿入します。おまけとして、ネストされたループを理解して抽出します...

于 2012-05-18T15:32:25.790 に答える
0
>>> import itertools
>>> l1 = [1, 2, 3]
>>> l2 = ['x', 'y', 0, 0, 0]
>>> l4 = []
>>> cyc = itertools.cycle(l1)
>>> for el in set(itertools.permutations(l2, 5)):
...     l4.append([cyc.next() if j==0 else j for j in el])

生成:

>>> l4
[[1, 2, 'x', 3, 'y'], 
 ['y', 'x', 1, 2, 3], 
 ['x', 1, 'y', 2, 3], 
 ['x', 1, 2, 'y', 3], 
 [1, 2, 3, 'y', 'x'], 
 [1, 'y', 2, 3, 'x'], 
 [1, 2, 3, 'x', 'y'], 
 [1, 'x', 2, 3, 'y'], 
 [1, 'y', 'x', 2, 3], 
 [1, 2, 'x', 'y', 3], 
 [1, 2, 'y', 'x', 3], 
 [1, 'x', 2, 'y', 3], 
 ['y', 1, 2, 'x', 3], 
 ['x', 1, 2, 3, 'y'], 
 [1, 'y', 2, 'x', 3], 
 [1, 'x', 'y', 2, 3], 
 ['y', 1, 2, 3, 'x'], 
 ['x', 'y', 1, 2, 3], 
 [1, 2, 'y', 3, 'x'], 
 ['y', 1, 'x', 2, 3]]
于 2012-05-18T16:23:12.717 に答える
0

l1 のクラスプレースホルダーを使用して何かを試しましitertools.permutationsたが、重複がありました。

だから、もう一度やり直して、これは私がそれを得ることができた中で最も簡単です:

from itertools import combinations, permutations

l1 = [1, 2, 3]
l2 = ["x", "y"]
r = range(len(l1)+len(l2))
for combo in combinations(r,len(l2)):
  for permu in permutations(l2):
    i1 = iter(l1).next
    i2 = iter(permu).next
    row = [ i2() if i in combo else i1() for i in r ]
    print row

収量:

['x', 'y', 1, 2, 3]
['y', 'x', 1, 2, 3]
['x', 1, 'y', 2, 3]
['y', 1, 'x', 2, 3]
['x', 1, 2, 'y', 3]
['y', 1, 2, 'x', 3]
['x', 1, 2, 3, 'y']
['y', 1, 2, 3, 'x']
[1, 'x', 'y', 2, 3]
[1, 'y', 'x', 2, 3]
[1, 'x', 2, 'y', 3]
[1, 'y', 2, 'x', 3]
[1, 'x', 2, 3, 'y']
[1, 'y', 2, 3, 'x']
[1, 2, 'x', 'y', 3]
[1, 2, 'y', 'x', 3]
[1, 2, 'x', 3, 'y']
[1, 2, 'y', 3, 'x']
[1, 2, 3, 'x', 'y']
[1, 2, 3, 'y', 'x']
于 2012-05-18T15:27:58.547 に答える