2017-02-09 9 views
0

文字列のすべての部分列を取得しようとしています。例: -大きな文字列の部分列の検索

firstString = "ABCD" 

O/Pは次のとおりです。そのために

'ABCD', 'BCD', 'ACD', 'ABD', 'ABC', 'CD', 'BD', 'BC', 'AD', 'AC', 'AB', 'D', 'C', 'B', 'A' 

私は、次のコードの一部を使用しています: -

#!usr/bin/python 

from __future__ import print_function 
from operator import itemgetter 
from subprocess import call 
import math 
import itertools 
import operator 

call(["date"]) 

firstArray = [] 

firstString = "ABCD" 

firstList = list(firstString) 

for L in range(0, len(firstList)+1): 
    for subset in itertools.combinations(firstList, L): 

      firstArray.append(''.join(subset)) 

firstArray.reverse() 

print (firstArray) 

call(["date"]) 

しかし、このコードはスケーラブルではありません。

私が提供した場合: -

firstString = "ABCDABCDABCDABCDABCDABCDABCD" 

をプログラムが完了するまでに約6分の時間がかかります。

スクリプトを実行している間----------------

python sample-0012.py 
Wed Feb 8 21:30:30 PST 2017 
Wed Feb 8 21:30:30 PST 2017 
--------------------キャプチャ

誰かが助けてくれますか?

+0

私はあなたが現実的でなければならないと思います。文字列の長さは28文字で、長さが268435456のpowersetを返します(空のセットを含めない場合は1文字小さい)。それは目の瞬きの中で決して起こることはありません。リバースを呼び出すことは、怠惰なイテレータを使用することを妨げるので、確かに役に立たない。おそらくあなたが本当に最低のものを最初に望むのであれば、より大きな組み合わせを最初に検索するために、おそらく '組み合わせ(data、len(firstList) - r)'を使うことができます。 –

答えて

0

探しているものを「パワーセット」(またはパワーセット)と呼びます。 DEF ウィキペディア:

Sは空集合とS自体を含むS、 のすべての部分集合の集合である任意のセットのパワーセット(又は冪)。

良い解決策は、再帰的かもしれないが、ここであなたは1を見つけることができます。 link

0

より良いPowersetのコンセプトを行うための How to get all possible combinations of a list’s elements?

otherwise, you can do like this. 
    wordlist = []  
    for i in range(len(firststring)): 
      ...:  comblist = combinations(list(firststring), i+1) 
      ...:  same_length_words = [] 
      ...:  for i, word in enumerate(comblist): 
      ...:   if word not in same_length_words: 
      ...:    same_length_words.append(word) 
      ...:  for each_word in same_length_words: 
      ...:   wordlist.append(''.join(each_word)) 
      ...: 
0

この

を試し、通過
from itertools import chain, combinations 
firstString = 'ABCD' 
data = list(firstString) 
lists = chain.from_iterable(combinations(data, r) for r in range(len(data)+1)) 
print [''.join(i) for i in lists if i] 

# ['A', 'B', 'C', 'D', 'AB', 'AC', 'AD', 'BC', 'BD', 'CD', 'ABC', 'ABD', 'ACD', 'BCD', 'ABCD'] 
関連する問題