Επιλογή, δείγμα και επιλογές για την τυχαία επιλογή στοιχείων από μια λίστα στην Python.

Επιχείρηση

Οι συναρτήσεις choice(), sample() και choices() στην ενότητα random της τυπικής βιβλιοθήκης της Python μπορούν να χρησιμοποιηθούν για την τυχαία επιλογή και ανάκτηση στοιχείων από μια λίστα, πλειάδα, συμβολοσειρά ή άλλο αντικείμενο ακολουθίας (τυχαία δειγματοληψία).

choice() παίρνει ένα μόνο στοιχείο, sample() και choices() παίρνουν μια λίστα πολλαπλών στοιχείων. sample() είναι μη ανακτήσιμη εξαγωγή χωρίς αντίγραφα, choices() είναι ανακτήσιμη εξαγωγή με αντίγραφα.

Οι ακόλουθες πληροφορίες παρέχονται εδώ.

  • Επιλέξτε ένα στοιχείο τυχαία.: random.choice()
  • Τυχαία επιλογή πολλαπλών στοιχείων (χωρίς αντίγραφα): random.sample()
  • Τυχαία επιλογή πολλαπλών στοιχείων (με αντίγραφα): random.choices()
  • Καθορισμός του σπόρου τυχαίων αριθμών

Επιλέξτε ένα στοιχείο τυχαία.: random.choice()

Με τη συνάρτηση choose() της random module, ένα στοιχείο επιλέγεται τυχαία από τη λίστα και μπορεί να ανακτηθεί.

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()

Με τη συνάρτηση sample() της ενότητας random, μπορείτε να πάρετε πολλαπλά στοιχεία τυχαία από μια λίστα. Δεν υπάρχει επανάληψη των στοιχείων (μη ανακτήσιμη εξαγωγή).

Το πρώτο όρισμα είναι μια λίστα και το δεύτερο όρισμα είναι ο αριθμός των στοιχείων που πρέπει να ανακτηθούν. Η λίστα επιστρέφεται.

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]

Αν θέλετε να αποφύγετε τις διπλές τιμές, μπορείτε να χρησιμοποιήσετε τη set() για να το μετατρέψετε σε σύνολο (τύπου set) και να εξάγετε μόνο τα μοναδικά στοιχεία και στη συνέχεια να χρησιμοποιήσετε τη sample().

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

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

Τυχαία επιλογή πολλαπλών στοιχείων (με αντίγραφα): random.choices()

Η συνάρτηση choices() της random module σας επιτρέπει να ανακτήσετε πολλαπλά στοιχεία τυχαία από μια λίστα, και σε αντίθεση με την sample(), επιτρέπει την επιλογή διπλών στοιχείων.

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

Το όρισμα weights μπορεί να χρησιμοποιηθεί για να καθορίσει το βάρος (πιθανότητα) ότι κάθε στοιχείο θα επιλεγεί και ο τύπος των στοιχείων της λίστας μπορεί να είναι int ή float.

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]

Η προεπιλογή και για τα δύο ορίσματα weights και cum_weights είναι None, πράγμα που σημαίνει ότι κάθε στοιχείο επιλέγεται με την ίδια πιθανότητα.

Εάν το μήκος (αριθμός στοιχείων) του επιχειρήματος 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_

Αποτελεί επίσης σφάλμα ο ταυτόχρονος προσδιορισμός weights και 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

Έχουμε καθορίσει μια λίστα ως πρώτο όρισμα ως παράδειγμα στον κώδικα του δείγματος μέχρι στιγμής, αλλά το ίδιο ισχύει και για πλειάδες και συμβολοσειρές.

Καθορισμός του σπόρου τυχαίων αριθμών

Δίνοντας έναν αυθαίρετο ακέραιο αριθμό στη συνάρτηση seed() της random module, μπορεί να καθοριστεί ο σπόρος τυχαίων αριθμών και να αρχικοποιηθεί η γεννήτρια τυχαίων αριθμών.

Μετά την αρχικοποίηση με τον ίδιο σπόρο, τα στοιχεία επιλέγονται πάντα με τον ίδιο τρόπο.

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

random.seed(0)
print(random.choice(l))
# 3
Copied title and URL