2017-12-14 14 views
2

文字列のリスト内のすべての可能な組み合わせに冗長性を避けたい(例えば、1122は私の文脈で2211と同じものなので、結果リスト)。冗長性を避けて文字列の組み合わせにフィルタを適用する方法

また、組み合わせ中にフィルタを適用したいと思います。たとえば、私は3を含む文字列を結果に含めることは望ましくありません。

このロジックはどのように処理する必要がありますか?

このコードは

>>> keywords = [''.join(i) for i in itertools.product(['11', '22', '33'], repeat = 2)] 
>>> keywords 
['1111', '1122', '1133', '2211', '2222', '2233', '3311', '3322', '3333'] 
+0

「2222」と「3333」もスキップする必要がありますか? – RomanPerekhrest

+0

ソートされた文字列が新しいリストに存在しない場合は、各文字列をループしてソートして元の文字列を追加することがあります:https://stackoverflow.com/questions/15046242/how-to-sort-the-letters-in-a-string-アルファベット順に並んでいます。あなたが行きたいと思う正しい方向のように見えたら、より良い答えを書くことができます。 – sniperd

+0

3を含む任意の文字列を削除する必要があります。 – Michael

答えて

2

あなたの実際のデータに応じて、より効率的な方法ですが、以下のアルゴリズムが有効です。簡単な比較で重複を排除します。私は '3'のチェックを関数に入れました。それはリストの理解の中で直接行うよりもやや遅いですが、コードがより一般的になります。

import itertools 

bases = ['11', '22', '33', '44'] 

def is_ok(u, v): 
    ''' Test if a u,v pair is permitted ''' 
    return not ('3' in u or '3' in v) 

keywords = [u+v for u, v in itertools.product(bases, repeat = 2) if u <= v and is_ok(u, v)] 

出力

['1111', '1122', '1144', '2222', '2244', '4444'] 
print(keywords) 
0

組み合わせを行っている。これは、あなたが欲しいものを行う必要があります。

import itertools 

def main(): 

    newkeywords = [] 
    keywords = ["".join(i) for i in itertools.product(["11", "22", "33"], repeat = 2)] 
    for item in keywords: 
     newitem = "".join(sorted(item)) 
     if "3" not in newitem and newitem not in newkeywords: 
      newkeywords.append(newitem) 
    print(newkeywords) 

main() 

結果:

['1111', '1122', '2222'] 

をこれは、新しいリストを作成し、それがソートされた場合(1122が2211と同じになる)アイテムが存在するか、または数字「3」が存在する場合、それを新しいリストに追加しないでください。

2

同じでitertools.combinations_with_replacementをフィルタリングすることにより可能である:

コード

import itertools as it 


bases = ["11", "22", "33", "44"] 

[x+y for x,y in it.combinations_with_replacement(bases, 2) if "3" not in x+y] 
# ['1111', '1122', '1144', '2222', '2244', '4444'] 

このバージョンではより一般的であるとしません数値文字列を比較することに依存します。 combinations_with_replacement()ためのコードも要素がないエントリをフィルタリングした後product()のサブシーケンスとして表現することができる

:この作品なぜ我々は理解することができますthe docsから詳細


ソートされた順序で(入力プール内の位置に応じて)

def combinations_with_replacement(iterable, r): 
    pool = tuple(iterable) 
    n = len(pool) 
    for indices in product(range(n), repeat=r): 
     if sorted(indices) == list(indices): 
      yield tuple(pool[i] for i in indices) 

このように、各項目は一意のインデックスに関連付けられます。 2つのアイテムのインデックスを比較すると、ソートされた組み合わせのみがアイテムを生成するために使用されます。残りのインデックスはすでに見ているように破棄されます。

(0, 0) 
(0, 1) 
(0, 2) 
(0, 3) 
(1, 0)           # discarded 
(1, 1) 
... 

は、このツールとitertools.product間の類似性の詳細については、the docsを参照してください。

関連する問題