2011-12-01 18 views
6

की randomising मामले की सबसे तेज़ तरीका है मैं एक स्ट्रिंग के मामले randomise करना चाहते हैं, यहाँ मैं क्या है: यदि आप सूची समझ इस्तेमाल कर सकते हैं यह तेजी से बनाने के लिएअजगर एक स्ट्रिंग

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 

इम सोच। मैं सके randomchoice में कम() और ऊपरी() फ़ंक्शन मैं की तरह

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

कुछ करने की कोशिश का उपयोग करने लगते हैं, लेकिन मैं 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 बेतरतीब ढंग से दो कार्य str.upper, str.lower से एक का चयन करता है।

फिर यह फ़ंक्शन इनपुट स्ट्रिंग s में प्रत्येक अक्षर के लिए x पर लागू होता है।

प्रारंभिक स्ट्रिंग छोटे अक्षरों में सभी पत्र, कि मैं इस कोड का प्रयोग करेंगे तो:

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

क्योंकि प्रारंभिक कोड लोअरकेस प्रारंभिक स्ट्रिंग के मामले में पत्र के आधे पर अनावश्यक str.lowercase का प्रयोग करेंगे।

वैसे, माइकल जे बार्बर द्वारा दूसरे उत्तर को देखें। पाइथन के पास फंक्शन कॉल के लिए भारी शुल्क है। अपने कोड में वह केवल एक बार str.upper पर कॉल करता है। मेरे कोड 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 और क्योंकि के लिए कई कम कॉल करता है, इससे भी महत्वपूर्ण बात यह है कि यह ओ (एन^2) लगातार अनुवर्ती ऐप से बचाता है जो आपने लूप के साथ संस्करण में उपयोग किया था।

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

टिप्पणी में टिम Pietzcker ने सुझाव दिया है, मैं random.choice का उपयोग किया है से पत्र का चयन करने के:

प्रश्न के संशोधन के साथ

, आप दोनों लोअरकेस और अपरकेस संस्करण बनाने के लिए की आवश्यकता होगी zip कॉल द्वारा बनाए गए tuples।

सवाल के बाद से गति पर अधिक ध्यान केंद्रित करने के लिए बदल दिया गया है, सबसे तेजी से दृष्टिकोण Numpy का उपयोग कर जाने की संभावना है:

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

+1, लेकिन x में x के लिए 'random.choice (x) ज़िप (...) 'अच्छा आईएमओ देखेंगे। –

+0

ये मैंने मिश्रित मामला का जिक्र नहीं किया, क्षमा करें। यह तेजी से दिखता है, धन्यवाद। मेरा प्रश्न अपडेट किया गया। –

+0

मैंने उत्तर में समय तुलना की तुलना की। @TimPietzcker – ovgolovin

संबंधित मुद्दे