2011-12-01 17 views
6

ait randomising davanın hızlı yolu ben heres bende olanı bir dize davayı randomise istiyorum: Eğer daha hızlı yapmak için liste anlama kullanabilirsiniz eğerPitonlar bir dize

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 

Im merak. Ben edemedim i

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

gibi bir şey yapmaya çalıştık randomchoice düşük() ve üst() işlevlerini kullanmak gibi görünüyor ama Thats yanlış düşünüyorum. bunun gibi bir şey mümkün mü?

cevap

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

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

random.choice rasgele iki işlev str.upper, str.lower dan birini seçer. Bu işlev s giriş dizesindeki her harf için x'a uygulanır. Daha sonra bu işlev s giriş dizesindeki her harf için uygulanır.

İlk dize Bu kodu kullanmak istiyorsunuz küçük harflerle tüm harfleri, varsa: ilk kod küçük başlangıç ​​dize halinde harflerin yarısında gereksiz str.lowercase kullanmak çünkü

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

. Bu arada, Michael J. Barber'ın diğer cevabına bakın. Python, işlev çağrıları için ağır cezalar yükler. Kodunda str.upper'u sadece bir kez arar. Kodumda str.upper, ilk dizenin sembollerinin yaklaşık yarısı için çağrılır. Yani hala bellekte geçici bir üst-kılıflı dize yaratılmış, kodunun zaman etkinliği çok daha büyük olabilir.


Lo beğenirsin:

Kod zamanlama karşılaştırmaları: https://ideone.com/eLygn

+2

Neden küçük zaten bir ipe 'str.lower()' diyoruz? –

+0

, her durumda olabilir. teşekkürler beyler! –

+1

@TimPietzcker çünkü ilk dize – ovgolovin

4

bu deneyin:

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

o upper çünkü birçok az çağrı yapar, çünkü bu sürümünü daha iyi performans olmalıdır, Daha da önemlisi, sürümde kullandığınız O (N^2) ardışık ekleri döngülerle önler. yorumlarında Tim Pietzcker önerdiği gibi, ben mektuplar seçmek için random.choice kullandım

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

:

soruya modifikasyon ile

, sen küçük harf ve büyük sürümlerini oluşturmanız gerekir zip çağrı tarafından oluşturulan tuples. Söz yana

hız daha fazla odaklanması değiştirildi, en hızlı yaklaşım Numpy kullanıyor muhtemeldir:

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

+1, ancak zip (...) 'de x için' random.choice (x) 'daha güzel IMO görünürdü. –

+0

yeh ben karışık durumdan bahsetmedim, üzgünüm. Bu daha hızlı görünüyor, teşekkürler. sorumu güncelledi. –

+0

Yanıtla zamanlama karşılaştırmaları ekledim. @TimPietzcker – ovgolovin