Python中的随机迭代
当你想要顺序遍历一串数字时,你可以这样写:
for i in range(1000):
# do something with i
但是如果你想要随机地遍历从0到999的数字呢?这就需要在每次遍历时随机选择一个之前没有选择过的数字,并且要确保遍历到所有的数字,从0到999。
你知道怎么聪明地做到这一点吗?
6 个回答
20
人们常常错过了将代码模块化的机会。你可以定义一个函数来封装“随机迭代”的概念:
def randomly(seq):
shuffled = list(seq)
random.shuffle(shuffled)
return iter(shuffled)
然后:
for i in randomly(range(1000)):
#.. we're good to go ..
36
这里有一种不同的方法,可以以随机顺序遍历一个列表。这个方法不会像使用shuffle()那样改变原来的列表。
lst=['a','b','c','d','e','f']
for value in sorted(lst,key=lambda _: random.random()):
print value
或者:
for value in random.sample(lst,len(lst)):
print value
52
你可以使用 random.shuffle()
来打乱一个列表的顺序:
import random
r = list(range(1000))
random.shuffle(r)
for i in r:
# do something with i
顺便说一下,在很多情况下,如果你在其他编程语言中会用 for
循环来遍历一系列整数的话,在Python中你可以直接描述你想要遍历的“东西”。
比如说,如果你想用 i
的值来访问列表中的元素,直接打乱列表会更好:
lst = [1970, 1991, 2012]
random.shuffle(lst)
for x in lst:
print x
注意:使用 random.shuffle()
时,你需要记住以下警告(摘自文档):
请注意,对于即使是比较小的列表长度,列表的所有排列方式总数都比大多数随机数生成器的周期要大;这意味着大部分长序列的排列方式是无法生成的。