4

文字列を受け取り、その文字列内のすべての文字をあらゆる方法で置き換える関数のヘルプを探しています。私の質問をどのように表現すればよいのかよくわからないので、それが何をすべきかをお見せします。

stars('1')
returns ['*']

stars('12')
returns ['*1', '1*', '**']

stars('123')
returns ['*23', '1*3', '12*', '**3', '*2*', '**1', '***']

stars('1234')
returns ['*234', '1*34', '12*4', '123*', '**34', '*2*4', '*23*', '1**4', '1*3*', 
         '12**', '***4', '**3*', '*2**', '1***', '****']

それはすべて手作業で行いましたが、私が間違えたとしても、あなたは私が今何を探しているのかを理解する必要があります。最後のケース(すべて*)は必須ではありませんが、問題が理解されていることを確認するためにそこに入れました。

これが私がこれまでに思いついたものですが、それは完全には機能しません。

def stars(n):
    lst = []
    length = len(n)
    for j in xrange(0, length):
        p = list(n)
        for k in xrange(j, length):
            p[k] = '*'
            lst += [''.join(p)]
    return lst

出力:

'1' returns ['*']
'12' returns ['*2', '**', '1*']
'123' returns ['*23', '**3', '***', '1*3', '1**', '12*']
'1234' returns ['*234', '**34', '***4', '****', '1*34', '1**4', '1***', '12*4', '12**', '123*']

どんな助けでも大歓迎です。可能であればPythonでこれに答えてほしいのですが、Pythonがわからない場合は、擬似コードまたは別の言語を使用できます。明確に書かれていれば、自分でPythonに変換できると思います。

4

4 に答える 4

8

itertoolsPythonの標準的なアプローチは、モジュールを使用することだと思います。

>>> from itertools import product, cycle
>>> s = 'abcde'
>>> [''.join(chars) for chars in product(*zip(s, cycle('*')))]
['abcde', 'abcd*', 'abc*e', 'abc**', 'ab*de', 'ab*d*', 'ab**e', 'ab***', 
 'a*cde', 'a*cd*', 'a*c*e', 'a*c**', 'a**de', 'a**d*', 'a***e', 'a****', 
 '*bcde', '*bcd*', '*bc*e', '*bc**', '*b*de', '*b*d*', '*b**e', '*b***',
 '**cde', '**cd*', '**c*e', '**c**', '***de', '***d*', '****e', '*****']

そして、星なしで最初のものを投げることができますが、それは少し魔法のように見えるかもしれません。

組み込みのデカルト積関数を使用したくない場合、ISTMには他に2つのアプローチがあります。再帰を使用するか、各スターのオンとオフを切り替えるという事実を利用することができます。バイナリスイッチです。つまり、n文字の場合、2 ^ n(星なしの場合は-1)を返す可能性があり、星をどこかに置くかどうかは、数字の対応するビットが設定されているかどうかに対応します。 (たとえば、「abc」の場合、1から7までループし、1 = 001で最後の場所に星を配置し、7 = 111でどこにでも星を配置します)。

この最後の1つは実装が非常に簡単なので、お任せします。:^)

于 2012-11-07T17:41:15.313 に答える
2

これは、元の文字列内の文字のすべてのサブシーケンスを見つけて反復する問題と見なすことができます。(すべてのサブシーケンスについて、その中の文字を「*」に置き換え、残りはそのままにします)。

特定のサブシーケンスでは、各文字が含まれているかどうかに関係なく、N文字の文字列の場合は2^N個のサブシーケンスがあります。おそらく、それらを反復処理する最も簡単な方法は、0から(2 ^ N)-1までの整数を反復処理し、文字を置き換える必要があるかどうかの指標としてそれらのバイナリ表現を使用することです。

N = 3の場合、次のようになります。

0  000 abc
1  001 ab*
2  010 a*c
3  011 a**
4  100 *bc
5  101 *b*
6  110 **c
7  111 ***

Pythonでは、次のように実行できます。

def stars(input):
    l = len(input)
    for i in xrange(2**l):
        yield ''.join([('*' if i&(2**(l-pos-1)) else ch) for pos, ch in enumerate(input)])

やってみよう:

>>> print list(stars('abc'))
['abc', 'ab*', 'a*c', 'a**', '*bc', '*b*', '**c', '***']
于 2012-11-07T17:53:00.517 に答える
1

使用する方法は次のcombinationsとおりです。

from itertools import combinations
def stars(str):
    N,L = len(str), []
    for k in range(0,N+1):
        for com in combinations(range(N),k):
            S = list(str)
            for x in com: S[x] = '*'
            L.append(''.join(S))
    return L

やってみよう:

>>> stars('abc')
['abc', '*bc', 'a*c', 'ab*', '**c', '*b*', 'a**', '***']
>>> stars('1234')
['1234', '*234', '1*34', '12*4', '123*', '**34', '*2*4', '*23*', '1**4', '1*3*', '12**', '***4', '**3*', '*2**', '1***', '****']
于 2012-11-07T18:29:39.563 に答える
0

またはPythonに固有の場合は、次の関数を参照してください:http: //docs.python.org/2/library/itertools.html#itertools.combinations

于 2012-11-07T17:33:08.160 に答える