mirror of
https://github.com/python/cpython.git
synced 2025-07-29 14:15:07 +00:00
SF bug #1460340: random.sample can raise KeyError
Fix the hit and miss style of testing for sets and dicts.
This commit is contained in:
parent
62e97f023b
commit
3c3346daa9
2 changed files with 14 additions and 10 deletions
|
@ -312,17 +312,18 @@ class Random(_random.Random):
|
|||
pool[j] = pool[n-i-1] # move non-selected item into vacancy
|
||||
else:
|
||||
try:
|
||||
n > 0 and (population[0], population[n//2], population[n-1])
|
||||
except (TypeError, KeyError): # handle non-sequence iterables
|
||||
population = tuple(population)
|
||||
selected = set()
|
||||
selected_add = selected.add
|
||||
for i in xrange(k):
|
||||
j = _int(random() * n)
|
||||
while j in selected:
|
||||
selected = set()
|
||||
selected_add = selected.add
|
||||
for i in xrange(k):
|
||||
j = _int(random() * n)
|
||||
selected_add(j)
|
||||
result[i] = population[j]
|
||||
while j in selected:
|
||||
j = _int(random() * n)
|
||||
selected_add(j)
|
||||
result[i] = population[j]
|
||||
except (TypeError, KeyError): # handle sets and dictionaries
|
||||
if isinstance(population, list):
|
||||
raise
|
||||
return self.sample(list(population), k)
|
||||
return result
|
||||
|
||||
## -------------------- real-valued distributions -------------------
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue