26

文字列を受け取るプログラムを書きたいとしましょう。たとえば"Fox"、次のように表示されます。

fox, Fox, fOx, foX, FOx, FoX, fOX, FOX

これまでの私のコード:

string = raw_input("Enter String: ")
length = len(string)
for i in range(0, length):
    for j in range(0, length):
        if i == j:
            x = string.replace(string[i], string[i].upper())
            print x

これまでの出力:

Enter String: fox
Fox
fOx
foX
>>> 
4

6 に答える 6

50
import itertools

s = 'Fox'
map(''.join, itertools.product(*zip(s.upper(), s.lower())))
>>> ['FOX', 'FOx', 'FoX', 'Fox', 'fOX', 'fOx', 'foX', 'fox']
于 2012-06-21T18:32:20.057 に答える
7

私はいつもこれを試してみたかった.

これがあなたの資格に合っているかどうかはわかりません(ただし、機能します)。

str = raw_input()

def getBit(num, bit):
   return (num & 1 << bit) != 0

for i in xrange(0,2**len(str)):
   out = ""
   for bit in xrange(0,len(str)):
      if getBit(i,bit):
         out += str[bit].upper()
      else:
         out += str[bit].lower()

   print(out)

アイデアは、バイナリでインクリメントすると、1 と 0 のすべての可能な順列が得られるということです。

次に、この 1 と 0 のリストを単純に文字列に変換します。1 は大文字を意味し、0 は小文字を意味します。

于 2012-06-21T18:30:46.280 に答える
3

これは、@ephemient による優れた受け入れられた回答を少し修正したものです。

変更点:

  • リストが「FOX」ではなく「fox」で始まるように、大文字の前に小文字を使用します(質問の例のシーケンスは「fox」で始まります)

  • の代わりにリスト内包表記を使用しますmap()(どちらの方法でも問題ありません)。

  • より明確にするために、小文字と大文字のペアを生成するコードを分割しました

  • 関数にパッケージ化しました。

コード:

import itertools as it

def cap_permutations(s):
    lu_sequence = ((c.lower(), c.upper()) for c in s)
    return [''.join(x) for x in it.product(*lu_sequence)]
于 2012-06-23T00:13:42.173 に答える
2

リスト内包表記を使用したワンライナー:

from itertools import permutations

strs='fox'
combin=[''.join(x) for x in permutations(list(strs)+list(strs.upper()),3) if ''.join(x).lower()=='fox']
print(combin)
>>> ['fox', 'foX', 'fOx', 'fOX', 'Fox', 'FoX', 'FOx', 'FOX']

for ループの使用:

from itertools import permutations

strs='fox'
lis2=list(strs)+list(strs.upper())

for x in permutations(lis2,3):
    if ''.join(x).lower()=='fox':
        print(''.join(x))

>>> fox
    foX
    fOx
    fOX
    Fox
    FoX
    FOx
    FOX
于 2012-06-21T18:35:39.483 に答える