2017-01-25 12 views
0

オンラインで次の問題の正確な答えが見つかりませんでした。 文字セットがkで、長さがnの文字列内で可能な組み合わせをすべて作成したい場合は、各文字が文字列に少なくとも1回表示されます。これは'abc' == 'cba'となります。 私はこれらの文字列を得るコードを必要とします('abc' == 'cba'のような重複はありません)。私はいくつかのネストされたループと再帰的なコードブロックを試しましたが、どちらもそれが私のために働いていました。 (Pythonは答えは素晴らしいことだ、この言語であることができれば私の主な言語は何である)文字セットkとlemgth nの文字列をすべて作成

例:

>>> def gen(s, count): 
...  for comb in itertools.combinations_with_replacement(s, count): 
...   if len(set(comb)) == len(s): 
...    yield ''.join(comb) 
...    
>>> [s for s in gen('abc', 5)] 
['aaabc', 'aabbc', 'aabcc', 'abbbc', 'abbcc', 'abccc'] 

In: 
chars = ['a', 'b', 'c'] 
length = 5 
Out: 
'abccc', 'abbcc', 'abbbc', 'aabcc', 'aabbc', 'aaabc' 
+1

マージ変わらない部分、ここであなたの試みを投稿してください。スタックオーバーフローは、人々がコードを書く場所ではありません。 –

+2

私が自分の問題を解決する方法を理解すれば、自分自身でコードを書くことができると思います。それでもあなたの返事をありがとう、私は次回にコードを追加します! –

答えて

1

itertoolsはあなたが道のほとんどを得ることができます除外している組み合わせを生成することには非効率的ですが、パフォーマンスに重大な影響を及ぼさないコードであれば、その時期に心配する必要はありません。 combinations_with_replacement(..)が生成するので、名前が言うように

import itertools 

def generate_strings(chars,n): 
    return [''.join(x) for x in itertools.combinations_with_replacement(chars,n) if all(c in x for c in chars)] 

これは、与えられた要素のタプルですが、どこの各要素が何回も発生する可能性があります。

+0

ありがとうございます!私はこれに組み込み関数があることを知っていて、次回のドキュメントについてもう少し研究をします。 –

1

あなたは、単にそのためitertoolsを使用することができます。だから、:

>>> list(itertools.combinations_with_replacement(['a','b'],3)) 
[('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'b', 'b'), ('b', 'b', 'b')] 

今、私たちは追加のフィルタリングを実行します。すべての文字が、我々が生成される文字列内に存在する場合

... if all(c in x for c in chars) 

だから我々は確認してください。

ここでは、''.join(..)を呼び出して、タプルの文字を一緒に文字列に結合します。上記のサンプルでは、​​["aab","abb"]を生成します。あなたの特定のクエリのために

は、それが生成されます。

>>> generate_strings(['a','b','c'],5) 
['aaabc', 'aabbc', 'aabcc', 'abbbc', 'abbcc', 'abccc'] 
+0

"各文字は文字列" – wim

+0

@wim:fixed、better? "に少なくとも1回は現れます。 –

0

は変わらず参加してください - ここでは「ABC」

は、再帰的な方法や、ここでは「AA」、別のアプローチを使用して長さ(NK)とのすべての文字列を生成し、 'AB'、 '交流'、 'BB'、 'BC'、 'C​​' すべての生成された文字列

関連する問題