2017-12-27 13 views
-1

のは、私は、リストまたは型の配列があるとしましょう:可能なすべての順列で、リスト内のアイテムを交換

mylist = [1, 2, 3, 4] 

をそして、私はこのリスト内の項目を交換したいです。通常、私は次のようなものを使用します:

mylist[2] = 7 

これはうまくいきます。しかし、mylistの1つ以上のアイテムを交換するときに、mylistのすべての可能な順列を作成する方法を説明できる人がいますか?例えば、私は次のように作成したい:

[7, 2, 3, 4] 
[7, 7, 3, 4] 
[7, 2, 7, 4] 
[7, 7, 7, 4] 
[7, 2, 3, 7] 
...(and so on) 

私はすべての可能な順列を生成するitertoolsを使用することができます知っているが、どのように私は私が生成する前に、リスト内のすべての可能な場所にアイテムを代用するように指定することができます順列?ここで私はitertoolsを使用しようとした方法である:

list(itertools.permutations([1,2,3,4,7], 4)) 

それは順列に1回よりも7以上を代用しない、それはまた、数7を含まない順列を生成するので、これは動作しません。

+0

あなたの例では、置き換えられていないアイテムをそのまま残して、リストの少なくとも1つのアイテムを値(例では「7」)で置き換えたいとしているようです。それはあなたが意味することですか?あなたの例では結果に15のリストがありますか? –

+1

いくつかの結果リストに2〜3つのセブンがどのように得られるのか分かりません。 – timgeb

+0

この質問は説明するのは難しいことでした。私はすべての可能な場所で代用することを考えているので、順列のリストが生成されます。私はitertools.permutationsを使ってこれを解決することに集中していたので、この方法で説明しようとしました。おそらくそれは正しい言葉ではありませんでした。 – Alligator

答えて

3

使用itertools.combinations置き換えるためにインデックスを見つけるために:

replace = 7 
mylist = [1, 2, 3, 4] 
for i in range(1, len(mylist) + 1): 
    for selected in itertools.combinations(range(len(mylist)), i): 
     res = mylist[:] 
     for n in selected: 
      res[n] = replace 
     print(res) 

出力:あなたは関数を作成し、ちょうどその関数のリストと値を渡すと、あなたが欲しいものを得ることができます

[7, 2, 3, 4] 
[1, 7, 3, 4] 
[1, 2, 7, 4] 
[1, 2, 3, 7] 
[7, 7, 3, 4] 
[7, 2, 7, 4] 
[7, 2, 3, 7] 
[1, 7, 7, 4] 
[1, 7, 3, 7] 
[1, 2, 7, 7] 
[7, 7, 7, 4] 
[7, 7, 3, 7] 
[7, 2, 7, 7] 
[1, 7, 7, 7] 
[7, 7, 7, 7] 
+0

私はバイナリ表現でビットをシフトしている間に... :) +1 – splash58

+0

それです!興味深いitertools.combinationsの使用。ありがとう。 – Alligator

0

import itertools 
def replaced_it(list_1,value): 

    final_list = [] 
    len_=len(list_1) 
    track_index = [k for k, j in enumerate(list_1)] 
    for i in range(len(track_index) + 1): 


     empty_list = [value] 
     replaced_one = list_1[:] 
     for ia in itertools.permutations(track_index, r=i): 
      if ia: 
       for i, j in zip(ia, empty_list * len(ia)): 
        replaced_one[i] = j 
       if replaced_one not in final_list: 
        final_list.append(replaced_one) 
       replaced_one = list_1[:] 






    return final_list 

print(replaced_it([1,2,3,4],7)) 

出力:

[[7, 2, 3, 4], [1, 7, 3, 4], [1, 2, 7, 4], [1, 2, 3, 7], [7, 7, 3, 4], [7, 2, 7, 4], [7, 2, 3, 7], [1, 7, 7, 4], [1, 7, 3, 7], [1, 2, 7, 7], [7, 7, 7, 4], [7, 7, 3, 7], [7, 2, 7, 7], [1, 7, 7, 7], [7, 7, 7, 7]] 
関連する問題