在检查条件时随机迭代整个列表

时间:2015-07-28 17:46:37

标签: python iteration conditional-statements

我想随机迭代一个列表,直到满足条件。但是,在重复任何项目之前,我还想查看列表中的每个项目(随机!)。什么是最好的方法?

这就是我的想法:

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)

有没有办法在不使用索引的情况下执行此操作?

3 个答案:

答案 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()申请条件。