我想随机迭代一个列表,直到满足条件。但是,在重复任何项目之前,我还想查看列表中的每个项目(随机!)。什么是最好的方法?
这就是我的想法:
letters = ['a', 'b', 'c', 'd']
random.shuffle(letters)
index = 0
while somecondition:
dosomethingwith letters[index % len(letters)]
alter somecondition
index += 1
if index == len(letters):
random.shuffle(letters)
有没有办法在不使用索引的情况下执行此操作?
答案 0 :(得分:1)
你可以这样做:
done = False
while not done:
random.shuffle(letters)
for letter in letters:
if somecondition:
done = True
break
请注意,这会在访问完所有项目后反复更改遍历顺序,我假设这是您正在寻找的内容。
如果您想要一个固定(但仍然是随机)的顺序,那么您可以在进入循环之前执行random.shuffle(letters)
一次,而不是每次迭代。
答案 1 :(得分:0)
你可以定义一个函数来封装"随机迭代的想法":
def randomly(seq):
shuffled = list(seq)
random.shuffle(shuffled)
return iter(shuffled)
然后:
for i in randomly(letters):
#.. we're good to go ..
答案 2 :(得分:0)
要连续迭代列表,请使用itertools.cycle()
:
for c in itertools.cycle(letters):
if somecondition:
...
break
如果您每次都需要以新的随机顺序,您可以轻松地复制cycle()
的行为:
def random_cycle(ls):
local_ls = ls[:] # defensive copy
while True:
random.shuffle(local_ls)
for e in local_ls:
yield e
e.g:
>>> list(islice(random_cycle([1, 2, 3, 4]), 20))
[1, 4, 2, 3, 4, 2, 1, 3, 2, 3, 1, 4, 4, 3, 1, 2, 4, 3, 2, 1]
您可能还希望itertools.takewhile()
或itertools.dropwhile()
申请条件。