अजगर में क्यों random.shuffle
लौट रहा None
है?
>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> print shuffle(x)
None
मैं बदले हुए मूल्य को कैसे प्राप्त करूं None
?
अजगर में क्यों random.shuffle
लौट रहा None
है?
>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> print shuffle(x)
None
मैं बदले हुए मूल्य को कैसे प्राप्त करूं None
?
जवाबों:
random.shuffle()
x
सूची में जगह बदलता है ।
पाइथन एपीआई तरीके जो संरचना में परिवर्तन करते हैं None
, आम तौर पर वापस लौटते हैं , न कि संशोधित डेटा संरचना।
यदि आप मौजूदा के आधार पर एक नई रैंडम-शफ़ल सूची बनाना चाहते हैं , जहाँ मौजूदा सूची क्रम में रखी गई है, तो आप random.sample()
इनपुट की पूरी लंबाई के साथ उपयोग कर सकते हैं :
x = ['foo', 'bar', 'black', 'sheep']
random.sample(x, len(x))
आप छँटाई कुंजी के sorted()
साथ भी उपयोग कर सकते हैं random.random()
:
shuffled = sorted(x, key=lambda k: random.random())
लेकिन यह सॉर्टिंग (एक O (NlogN) ऑपरेशन) को आमंत्रित करता है, जबकि इनपुट लंबाई के लिए नमूना केवल O (N) संचालन लेता है (उसी प्रक्रिया random.shuffle()
का उपयोग किया जाता है, जो सिकुड़ते पूल से यादृच्छिक मानों को स्वैप करता है)।
डेमो:
>>> import random
>>> x = ['foo', 'bar', 'black', 'sheep']
>>> random.sample(x, len(x))
['bar', 'sheep', 'black', 'foo']
>>> sorted(x, key=lambda k: random.random())
['sheep', 'foo', 'black', 'bar']
>>> x
['foo', 'bar', 'black', 'sheep']
key
फ़ंक्शन का उपयोग करना वास्तव में गारंटी है? कुछ तेजी से छँटाई एल्गोरिदम पर गिर अगर तुलना आत्मनिर्भर नहीं हैं। मैं इस कार्य को किसी भी तरह से देख सकता हूं, कार्यान्वयन के आधार पर (सजावट-सॉर्ट-अनडकोरेट को केवल key
प्रत्येक तत्व पर एक बार लागू करने की आवश्यकता होगी ताकि यह अच्छी तरह से परिभाषित हो जाए)।
key
। तो हां, इसकी गारंटी है क्योंकि प्रत्येक मूल्य को एक बार उनकी यादृच्छिक कुंजी दी जाती है।
डॉक्स के अनुसार :
अनुक्रम x को जगह में फेरबदल करें। वैकल्पिक तर्क यादृच्छिक एक 0-तर्क फ़ंक्शन है जो [0.0, 1.0) में एक यादृच्छिक फ्लोट लौटाता है; डिफ़ॉल्ट रूप से, यह फ़ंक्शन यादृच्छिक () है।
>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> shuffle(x)
>>> x
['bar', 'black', 'sheep', 'foo']
shuffle
जगह में सूची को संशोधित करता है। यह अच्छा है, क्योंकि बड़ी सूची की नकल करना शुद्ध ओवरहेड होगा यदि आपको अब मूल सूची की आवश्यकता नहीं है।
के अनुसार "स्पष्ट अंतर्निहित से बेहतर है" के सिद्धांत pythonic शैली सूची लौटने, एक बुरा विचार किया जाएगा क्योंकि तब एक सोच सकते हैं यह, है एक नया, वास्तव में ऐसा नहीं है।
यदि आप करते हैं एक ताजा सूची की जरूरत है, आप की तरह कुछ लिखने के लिए करना होगा
new_x = list(x) # make a copy
random.shuffle(new_x)
जो अच्छी तरह से स्पष्ट है। यदि आपको बार-बार इस मुहावरे की आवश्यकता है, तो इसे एक फ़ंक्शन shuffled
(देखें sorted
) में लपेटें जो रिटर्न करता है new_x
।
मैं इस अवधारणा के साथ अपना आहा पल था:
from random import shuffle
x = ['foo','black','sheep'] #original list
y = list(x) # an independent copy of the original
for i in range(5):
print shuffle(y) # shuffles the original "in place" prints "None" return
print x,y #prints original, and shuffled independent copy
>>>
None
['foo', 'black', 'sheep'] ['foo', 'black', 'sheep']
None
['foo', 'black', 'sheep'] ['black', 'foo', 'sheep']
None
['foo', 'black', 'sheep'] ['sheep', 'black', 'foo']
None
['foo', 'black', 'sheep'] ['black', 'foo', 'sheep']
None
['foo', 'black', 'sheep'] ['sheep', 'black', 'foo']
पायथन एपीआई जो संरचना को जगह में बदल देता है, उत्पादन के रूप में कोई नहीं लौटाता है ।
list = [1,2,3,4,5,6,7,8]
print(list)
आउटपुट: [१, २, ३, ४, ५, ६, 2, 2]
from random import shuffle
print(shuffle(list))
आउटपुट: कोई नहीं
from random import sample
print(sample(list, len(list)))
आउटपुट: [3, ३, २, ४, ५, ६, १,,]
आप random.sample()
दूसरों द्वारा बताई गई जानकारी का उपयोग करके फेरबदल सूची को वापस कर सकते हैं । यह प्रतिस्थापन के बिना सूची से कश्मीर तत्वों का नमूना लेकर काम करता है । इसलिए यदि आपकी सूची में डुप्लिकेट तत्व हैं, तो उन्हें विशिष्ट रूप से माना जाएगा।
>>> l = [1,4,5,3,5]
>>> random.sample(l,len(l))
[4, 5, 5, 3, 1]
>>> random.sample(l,len(l)-1)
[4, 1, 5, 3]
>>> random.sample(l,len(l)-1)
[3, 5, 5, 1]