2011-12-01 3 views
6

のランダム化例最速の方法は、私はHERESに私が持っているもの、文字列の大文字と小文字をランダム化したい:あなたはより速くそれを作るために、リストの内包表記を使用することができればニシキヘビ文字列

word="This is a MixeD cAse stRing" 
word_cap='' 
for x in word: 
     if random.randint(0,1): 
       word_cap += x.upper() 
     else: 
       word_cap += x.lower() 
     word = word_cap 

print word 

イムは思っ。私はcouldntの は私が

''.join(randomchoice(x.upper(),x.lower()) for x in word) 

ような何かをしようとしたrandomchoice で下()と上()関数を使用するように見えるが、私はthatsの間違ったと思います。可能ですが、それのような何か?

答えて

8
import random 
s = 'this is a lower case string' 

''.join(random.choice((str.upper,str.lower))(x) for x in s) 

random.choice無作為に2つの機能str.upperstr.lowerから一つを選択します。

この機能は、入力文字列sの各文字に対してxに適用されます。

初期文字列は、私はこのコードを使用する小文字のすべての文字がある場合:初期のコードは小文字の最初の文字列の場合、文字の半分に冗長str.lowercaseを使用するため

''.join(x.upper() if random.randint(0,1) else x for x in s) 

を。

ところで、Michael J. Barberのもう1つの答えを見てください。 Pythonは関数呼び出しに多大な負担をかけます。彼のコードでは、str.upperを1回しか呼び出しません。私のコードでは、str.upperが最初の文字列の約半分のシンボルのために呼び出されます。だから一時的な大文字の文字列がメモリに作成されるので、コードの時間効率がはるかに高くなる可能性があります。


そしてなんと:

コードタイミングの比較:https://ideone.com/eLygn

+2

なぜすでに小文字の文字列に 'str.lower()'を呼び出しますか? –

+0

いずれの場合もあり得る。みんなありがとう! –

+1

@TimPietzcker初期の文字列が大文字の文字を持つ可能性があるので、 – ovgolovin

4

はこれを試してみてください:

word="this is a lower case string" 
caps = word.upper() 
''.join(x[random.randint(0,1)] for x in zip(word, caps)) 

それはupperとために多くの、より少ない呼び出しを行うので、これはあなたのバージョンをアウトパフォームする必要があり、さらに重要なことは、バージョンでO(N^2)が連続してループに追加されることを避けることです。コメントでティムPietzckerによって示唆されるように、私からの手紙を選択するためにrandom.choiceを使用しました

word="This is a MixeD cAse stRing" 
caps = word.upper() 
lowers = word.lower() 
''.join(random.choice(x) for x in zip(caps, lowers)) 

質問への変更で

、あなたは大文字と小文字の両方のバージョンを作成する必要がありますzipによって作成されたタプル。

質問はスピードに集中するように変更されていますので、最速のアプローチはnumpyのを使用してされる可能性が高い:

''.join(numpy.where(numpy.random.randint(2, size=len(caps)), list(caps), list(lowers))) 
+3

+1ですが、xのzip(...)の 'random.choice(x)'はIMOの方がよかったです。 –

+0

私は大文字と小文字が混在しているとは言いませんでした。これは、より速く、ありがとう。私の質問が更新されました。 –

+0

私は答えにタイミングの比較を追加しました。 @TimPietzcker – ovgolovin

関連する問題