पायथनमधील सूचीमधून यादृच्छिकपणे घटक निवडण्यासाठी निवड, नमुना आणि निवडी.

व्यवसाय

पायथन स्टँडर्ड लायब्ररीच्या यादृच्छिक मॉड्यूलमधील फंक्शन्स चॉईस(), सॅम्पल(), आणि चॉईसेस() सूची, टपल, स्ट्रिंग किंवा इतर सिक्वेन्स ऑब्जेक्ट (यादृच्छिक सॅम्पलिंग) मधील घटक यादृच्छिकपणे निवडण्यासाठी आणि पुनर्प्राप्त करण्यासाठी वापरला जाऊ शकतो.

choice() ला एकच घटक मिळतो, नमुना() आणि choices() ला अनेक घटकांची यादी मिळते. सॅम्पल() डुप्लिकेटसह नॉन-रिकव्हेबल एक्सट्रॅक्शन आहे, choices() डुप्लिकेटसह पुनर्प्राप्त करण्यायोग्य एक्सट्रॅक्शन आहे.

खालील माहिती येथे दिली आहे.

  • यादृच्छिकपणे एक घटक निवडा.:random.choice()
  • यादृच्छिकपणे एकाधिक घटक निवडा (डुप्लिकेट नाहीत):random.sample()
  • यादृच्छिकपणे एकाधिक घटक निवडा (डुप्लिकेटसह):random.choices()
  • यादृच्छिक संख्या बी निश्चित करा

यादृच्छिकपणे एक घटक निवडा.:random.choice()

यादृच्छिक मॉड्यूलच्या फंक्शन निवडा(), सूचीमधून एक घटक यादृच्छिकपणे निवडला जातो आणि तो पुनर्प्राप्त केला जाऊ शकतो.

import random

l = [0, 1, 2, 3, 4]

print(random.choice(l))
# 1

हेच ट्यूपल्स आणि स्ट्रिंग्सवर लागू होते. स्ट्रिंग्सच्या बाबतीत, एकच वर्ण निवडला जातो.

print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy

print(random.choice('abcde'))
# b

रिकामी सूची, ट्यूपल किंवा स्ट्रिंग वितर्क म्हणून निर्दिष्ट केल्यास त्रुटी.

# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence

यादृच्छिकपणे एकाधिक घटक निवडा (डुप्लिकेट नाहीत):random.sample()

यादृच्छिक मॉड्यूलच्या फंक्शन नमुना() सह, आपण सूचीमधून यादृच्छिकपणे एकाधिक घटक मिळवू शकता. घटकांचे कोणतेही डुप्लिकेशन नाही (पुनर्प्राप्त न करता येणारे निष्कर्ष).

पहिला युक्तिवाद एक सूची आहे आणि दुसरा युक्तिवाद पुनर्प्राप्त करण्यासाठी घटकांची संख्या आहे. यादी परत केली आहे.

import random

l = [0, 1, 2, 3, 4]

print(random.sample(l, 3))
# [2, 4, 0]

print(type(random.sample(l, 3)))
# <class 'list'>

जर दुसरा युक्तिवाद 1 वर सेट केला असेल, तर एक घटक असलेली सूची देखील परत केली जाईल; जर ते 0 वर सेट केले असेल, तर यादी रिकामी आहे. जर दुसरा युक्तिवाद 1 असेल, तर एक घटक असलेली सूची परत केली जाईल; जर ते 0 असेल, तर रिक्त यादी परत केली जाईल; जर पहिला युक्तिवाद सूचीतील घटकांच्या संख्येपेक्षा जास्त असेल तर एक त्रुटी येते.

print(random.sample(l, 1))
# [3]

print(random.sample(l, 0))
# []

# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative

जर पहिला युक्तिवाद ट्यूपल किंवा स्ट्रिंग असेल तर, जे परत केले जाते ते अद्याप एक सूची आहे.

print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']

print(random.sample('abcde', 2))
# ['b', 'e']

तुम्हाला ट्यूपल किंवा स्ट्रिंगवर परत यायचे असल्यास, tuple(), join() वापरा.

print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')

print(''.join(random.sample('abcde', 2)))
# dc

लक्षात ठेवा की मूल्याचा न्याय केला जात नाही, म्हणून मूळ सूची किंवा ट्यूपलमध्ये समान मूल्य असलेले घटक असल्यास, समान मूल्य निवडले जाण्याची शक्यता आहे.

l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]

print(random.sample(l_dup, 3))
# [3, 1, 1]

जर तुम्हाला डुप्लिकेट व्हॅल्यू टाळायच्या असतील, तर तुम्ही सेट() ते सेट (सेट प्रकार) मध्ये रूपांतरित करण्यासाठी वापरू शकता आणि फक्त अद्वितीय घटक काढू शकता आणि नंतर नमुना() वापरू शकता.

print(set(l_dup))
# {0, 1, 2, 3}

print(random.sample(set(l_dup), 3))
# [1, 3, 2]

यादृच्छिकपणे एकाधिक घटक निवडा (डुप्लिकेटसह):random.choices()

यादृच्छिक मॉड्यूलचे फंक्शन चॉईस() तुम्हाला सूचीमधून अनेक घटक यादृच्छिकपणे पुनर्प्राप्त करण्याची परवानगी देते आणि नमुना() च्या विपरीत, ते डुप्लिकेट घटक निवडण्याची परवानगी देते.

choices() हे Python 3.6 मध्ये जोडलेले फंक्शन आहे. पूर्वीच्या आवृत्त्यांमध्ये ते उपलब्ध नाही.

वितर्क k पुनर्प्राप्त करण्यासाठी घटकांची संख्या निर्दिष्ट करते. डुप्लिकेशनला परवानगी आहे, त्यामुळे मूळ सूचीमधील घटकांच्या संख्येपेक्षा पुनर्प्राप्त करण्याच्या घटकांची संख्या मोठी असू शकते.

k हा कीवर्ड-ओन्ली युक्तिवाद असल्याने, k=3 सारखा कीवर्ड निर्दिष्ट करणे आवश्यक आहे.

import random

l = [0, 1, 2, 3, 4]

print(random.choices(l, k=3))
# [2, 1, 0]

print(random.choices(l, k=10))
# [3, 4, 1, 4, 4, 2, 0, 4, 2, 0]

k चे डीफॉल्ट मूल्य 1 आहे; ते वगळल्यास, 1 घटक असलेली सूची परत केली जाईल.

print(random.choices(l))
# [1]

प्रत्येक घटक निवडले जातील असे वजन (संभाव्यता) निर्दिष्ट करण्यासाठी युक्तिवाद वजनांचा वापर केला जाऊ शकतो आणि सूचीमधील घटकांचा प्रकार int किंवा फ्लोट असू शकतो.

print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1]))
# [0, 2, 3]

print(random.choices(l, k=3, weights=[1, 1, 0, 0, 0]))
# [0, 1, 1]

युक्तिवाद cum_weights देखील संचयी वजन म्हणून निर्दिष्ट केला जाऊ शकतो. खालील नमुना कोडमधील कम_वजन हे वरील पहिल्या वजनाच्या समतुल्य आहे.

print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]

वितर्क वजन आणि कम_वजन दोन्हीसाठी डीफॉल्ट None आहे, याचा अर्थ प्रत्येक घटक समान संभाव्यतेसह निवडलेला आहे.

आर्ग्युमेंट वेट्स किंवा कम_वेट्सची लांबी (घटकांची संख्या) मूळ सूचीपेक्षा वेगळी असल्यास, त्रुटी येते.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_

एकाच वेळी वजन आणि कम_वजन निर्दिष्ट करणे देखील एक त्रुटी आहे.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1], cum_weights=[1, 2, 3, 13, 14]))
# TypeError: Cannot specify both weights and cumulative weights

आम्‍ही आत्तापर्यंत नमुना कोडमध्‍ये उदाहरण म्‍हणून पहिला वितर्क म्‍हणून सूची नमूद केली आहे, परंतु तीच ट्यूपल आणि स्ट्रिंगला लागू होते.

यादृच्छिक संख्या बी निश्चित करा

यादृच्छिक मॉड्यूलच्या फंक्शन सीड() ला अनियंत्रित पूर्णांक देऊन, यादृच्छिक क्रमांकाचे बीज निश्चित केले जाऊ शकते आणि यादृच्छिक संख्या जनरेटर आरंभ केला जाऊ शकतो.

समान बियाणे सुरू केल्यानंतर, घटक नेहमी त्याच प्रकारे निवडले जातात.

random.seed(0)
print(random.choice(l))
# 3

random.seed(0)
print(random.choice(l))
# 3