Random.shuffle कोई भी क्यों नहीं लौटाता?


90

अजगर में क्यों random.shuffleलौट रहा Noneहै?

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> print shuffle(x)
None

मैं बदले हुए मूल्य को कैसे प्राप्त करूं None?


रैंडम वैल्यू नहीं बल्कि लिस्ट की रैंडम फेरबदल।
अलाव


जवाबों:


162

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']

2
एक यादृच्छिक-मूल्यवान keyफ़ंक्शन का उपयोग करना वास्तव में गारंटी है? कुछ तेजी से छँटाई एल्गोरिदम पर गिर अगर तुलना आत्मनिर्भर नहीं हैं। मैं इस कार्य को किसी भी तरह से देख सकता हूं, कार्यान्वयन के आधार पर (सजावट-सॉर्ट-अनडकोरेट को केवल keyप्रत्येक तत्व पर एक बार लागू करने की आवश्यकता होगी ताकि यह अच्छी तरह से परिभाषित हो जाए)।
torek

2
@torek: जब कॉल करने योग्य के साथ छँटाई होती है, तो पायथन शोभा-प्रकार-अघोषित का उपयोग करता है key। तो हां, इसकी गारंटी है क्योंकि प्रत्येक मूल्य को एक बार उनकी यादृच्छिक कुंजी दी जाती है।
मार्टिन पीटर्स

37

यह तरीका भी काम करता है।

import random
shuffled = random.sample(original, len(original))

8

डॉक्स के अनुसार :

अनुक्रम x को जगह में फेरबदल करें। वैकल्पिक तर्क यादृच्छिक एक 0-तर्क फ़ंक्शन है जो [0.0, 1.0) में एक यादृच्छिक फ्लोट लौटाता है; डिफ़ॉल्ट रूप से, यह फ़ंक्शन यादृच्छिक () है।

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> shuffle(x)
>>> x
['bar', 'black', 'sheep', 'foo']

6

क्यों, सच में?

1. दक्षता

shuffleजगह में सूची को संशोधित करता है। यह अच्छा है, क्योंकि बड़ी सूची की नकल करना शुद्ध ओवरहेड होगा यदि आपको अब मूल सूची की आवश्यकता नहीं है।

2. पायथन शैली

के अनुसार "स्पष्ट अंतर्निहित से बेहतर है" के सिद्धांत pythonic शैली सूची लौटने, एक बुरा विचार किया जाएगा क्योंकि तब एक सोच सकते हैं यह, है एक नया, वास्तव में ऐसा नहीं है।

लेकिन मुझे यह इस तरह पसंद नहीं है!

यदि आप करते हैं एक ताजा सूची की जरूरत है, आप की तरह कुछ लिखने के लिए करना होगा

new_x = list(x)  # make a copy
random.shuffle(new_x)

जो अच्छी तरह से स्पष्ट है। यदि आपको बार-बार इस मुहावरे की आवश्यकता है, तो इसे एक फ़ंक्शन shuffled(देखें sorted) में लपेटें जो रिटर्न करता है new_x


2

मैं इस अवधारणा के साथ अपना आहा पल था:

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']

क्योंकि अजगर दर-दर-संदर्भ =) के बजाय डिफ़ॉल्ट रूप से "कॉपी-बाय-वैल्यू" करता है। stackoverflow.com/a/986495/610569
alvas

2

पायथन एपीआई जो संरचना को जगह में बदल देता है, उत्पादन के रूप में कोई नहीं लौटाता है ।

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, ३, २, ४, ५, ६, १,,]


0

आप 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]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.