random.choice सेट से? अजगर


93

मैं एक अनुमान लगाने के खेल के एआई हिस्से पर काम कर रहा हूं। मैं चाहता हूं कि एआई इस सूची से एक यादृच्छिक पत्र का चयन करे। मैं इसे एक सेट के रूप में कर रहा हूं ताकि मैं सूची से पत्र आसानी से निकाल सकूं क्योंकि वे खेल में अनुमान लगाए गए हैं और इसलिए अब फिर से अनुमान लगाने के लिए उपलब्ध नहीं हैं।

यह कहता है कि setवस्तु अनुक्रमणिका नहीं है। मैं इसके आसपास कैसे काम कर सकता हूं?

import random 
aiTurn=True

while aiTurn == True:
    allLetters = set(list('abcdefghijklmnopqrstuvwxyz'))
    aiGuess=random.choice(allLetters)



    print (aiGuess) 

1
संयोग से आपको अक्षरों का एक सेट प्राप्त करने के लिए सेट (सूची ('स्ट्रिंग')) का उपयोग करने की आवश्यकता नहीं है क्योंकि स्ट्रिंग्स स्वयं द्वारा चलने योग्य हैं - सेट ('एबीसी') वही करेगा जो आप चाहते हैं।
स्कॉट रिची

5
इस समस्या का सामना करने वाले अन्य लोगों के लिए, यह इस सवाल को देखने के लायक है कि सेट-अप ऑब्जेक्ट कैसे बनाया जाए जो कुशल यादृच्छिक चयन की अनुमति देता है। यहां दिए गए विकल्प सभी O (N) हैं। stackoverflow.com/q/15993447/2966723
जोएल

जवाबों:


91
>>> random.sample(set('abcdefghijklmnopqrstuvwxyz'), 1)
['f']

दस्तावेज़: https://docs.python.org/3/library/random.html#random.sample


9
[0]अंत में टैक करें ताकि यह मूल रूप से समान हो random.choice(जो सूची के रूप में इसका मान नहीं लौटाता)
Nick T

31
random.sampleकरता है tuple(population)आंतरिक रूप से है, तो random.choice(tuple(allLetters))बेहतर हो सकता है।
utapyngo

21
यह रेखांकित किया जाना चाहिए कि यह प्रक्रिया O (N) है।
जोएल

@Joel यह प्रक्रिया O (N) क्यों है?
मैनुएल श्नाइड 3r

2
मुझे लगता है कि यह वास्तव में अक्षम है ... जैसा कि आप देख सकते हैं github.com/python/cpython/blob/2.7/Lib/random.py#L332-L339 नमूना फ़ंक्शन सेट से एक सूची बनाता है जब आप उपरोक्त कॉल करते हैं और इसमें से एक यादृच्छिक तत्व लेता है। मान लीजिए आपके पास एक बड़ा सेट है और आप बहुत सारे नमूने बनाना चाहते हैं। यदि सेट नहीं बदलता है, तो इसे सूची और उपयोग में बदलना बेहतर होगा random.choice। यदि आप इसे सैंपल करते समय सेट भी बदलते हैं तो शायद आपको सेट का उपयोग बिल्कुल नहीं करना चाहिए। यदि आप सेट और बाल्टी के आकार में
व्याप्त

58

आपको उपयोग करना चाहिए random.choice(tuple(myset)), क्योंकि यह देखने में तेज़ और यकीनन क्लीनर है random.sample। मैंने परीक्षण के लिए निम्नलिखित लिखा:

import random
import timeit

bigset = set(random.uniform(0,10000) for x in range(10000))

def choose():
    random.choice(tuple(bigset))

def sample():
    random.sample(bigset,1)[0]

print("random.choice:", timeit.timeit(choose, setup="global bigset", number=10000)) # 1.1082136780023575
print("random.sample:", timeit.timeit(sample, setup="global bigset", number=10000)) # 1.1889629259821959

संख्याओं से ऐसा लगता है कि इसमें random.sample7% अधिक समय लगता है ।


2
मेरी मशीन पर, random.choice 7 गुना तेज है।
no --zɐɹƆ

4
वहाँ सीधे से सेट का चयन करने के लिए कोई रास्ता नहीं है, इसे tuple में कॉपी करने के बिना?
Youda008

मुझे 5000 तत्वों के सेट पर चुनने की तुलना में नमूना लगभग 12% (250 एमएस) धीमा है।
सिमोन

1
मेरी मशीन पर, सेट के आकार के बढ़ने random.sampleकी तुलना में धीमी गति से random.choiceहोने से यह अधिक तेज होता है (क्रॉसओवर बिंदु सेट आकार 100k-500k के बीच कहीं है)। यानी सेट जितना बड़ा होगा, उतनी random.sampleही तेजी से होने की संभावना है ।
जेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.