பைத்தானில் உள்ள பட்டியலிலிருந்து உறுப்புகளைத் தோராயமாகத் தேர்ந்தெடுப்பதற்கான தேர்வு, மாதிரி மற்றும் தேர்வுகள்.

வணிக

பைதான் நிலையான நூலகத்தின் சீரற்ற தொகுதியில் உள்ள செயல்பாடுகள் தேர்வு(), மாதிரி(), மற்றும் தேர்வுகள்() ஆகியவை ஒரு பட்டியல், டூப்பிள், சரம் அல்லது பிற வரிசைப் பொருளிலிருந்து (ரேண்டம் சாம்லிங்) உறுப்புகளைத் தோராயமாகத் தேர்ந்தெடுத்து மீட்டெடுக்கப் பயன்படும்.

தேர்வு() ஒற்றை உறுப்பைப் பெறுகிறது, மாதிரி() மற்றும் தேர்வுகள்() பல உறுப்புகளின் பட்டியலைப் பெறுகின்றன. மாதிரி() என்பது நகல்கள் இல்லாத மீட்டெடுக்க முடியாத பிரித்தெடுத்தல், தேர்வுகள்() என்பது நகல்களுடன் மீட்டெடுக்கக்கூடிய பிரித்தெடுத்தல் ஆகும்.

பின்வரும் தகவல்கள் இங்கே கொடுக்கப்பட்டுள்ளன.

  • சீரற்ற முறையில் ஒரு உறுப்பைத் தேர்ந்தெடுக்கவும்.:random.choice()
  • தோராயமாக பல கூறுகளைத் தேர்ந்தெடுக்கவும் (நகல்கள் இல்லை):random.sample()
  • தோராயமாக பல கூறுகளைத் தேர்ந்தெடுக்கவும் (நகல்களுடன்):random.choices()
  • சீரற்ற எண் விதையை சரிசெய்யவும்

சீரற்ற முறையில் ஒரு உறுப்பைத் தேர்ந்தெடுக்கவும்.:random.choice()

ரேண்டம் மாட்யூலின் செயல்பாடு தேர்வு(), பட்டியலில் இருந்து ஒரு உறுப்பு தோராயமாக தேர்ந்தெடுக்கப்பட்டு மீட்டெடுக்கப்படும்.

import random

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

print(random.choice(l))
# 1

அதே tuples மற்றும் சரங்கள் பொருந்தும். சரங்களின் விஷயத்தில், ஒற்றை எழுத்து தேர்ந்தெடுக்கப்பட்டது.

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 அல்லது சரத்திற்குத் திரும்ப விரும்பினால், 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]

நீங்கள் நகல் மதிப்புகளைத் தவிர்க்க விரும்பினால், நீங்கள் set() ஐப் பயன்படுத்தி அதை ஒரு தொகுப்பாக (தொகுப்பு வகை) மாற்றலாம் மற்றும் தனிப்பட்ட கூறுகளை மட்டும் பிரித்தெடுக்கலாம், பின்னர் மாதிரி() ஐப் பயன்படுத்தலாம்.

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

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

தோராயமாக பல கூறுகளைத் தேர்ந்தெடுக்கவும் (நகல்களுடன்):random.choices()

சீரற்ற தொகுதியின் செயல்பாட்டுத் தேர்வுகள்() ஒரு பட்டியலிலிருந்து சீரற்ற முறையில் பல கூறுகளை மீட்டெடுக்க உங்களை அனுமதிக்கிறது, மேலும் மாதிரி(), இது நகல் கூறுகளைத் தேர்ந்தெடுக்க அனுமதிக்கிறது.

தேர்வுகள்() என்பது பைதான் 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]

ஒவ்வொரு உறுப்பும் தேர்ந்தெடுக்கப்படும் எடையை (நிகழ்தகவு) குறிப்பிடுவதற்கு வாத எடைகள் பயன்படுத்தப்படலாம், மேலும் பட்டியலில் உள்ள உறுப்புகளின் வகை எண்ணாகவோ அல்லது மிதவையாகவோ இருக்கலாம்.

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 என்பது ஒட்டுமொத்த எடையாகவும் குறிப்பிடப்படலாம். பின்வரும் மாதிரிக் குறியீட்டில் உள்ள cum_weights மேலே உள்ள முதல் எடைகளுக்குச் சமம்.

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

மதிப்புகள் மற்றும் cum_weights ஆகிய இரண்டிற்கும் இயல்புநிலையானது எதுவுமில்லை, அதாவது ஒவ்வொரு உறுப்பும் ஒரே நிகழ்தகவுடன் தேர்ந்தெடுக்கப்படும்.

வாதம் எடைகள் அல்லது cum_weights ஆகியவற்றின் நீளம் (உறுப்புகளின் எண்ணிக்கை) அசல் பட்டியலில் இருந்து வேறுபட்டால், பிழை ஏற்படும்.

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

எடைகள் மற்றும் cum_weights ஆகியவற்றை ஒரே நேரத்தில் குறிப்பிடுவதும் பிழை.

# 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