随机切换列表但保留项目的顺序

时间:2014-06-03 16:51:39

标签: python loops python-2.7 random

我正在创建一个小脚本,它将获取一个pickle文件,读取其内容并将其呈现给用户。我正在开发一个允许随机选择列表的功能。每个列表代表一个文件。在这些列表中是项目。

我想要做的是在文件(主列表)之间随机跳转,但每次它返回到文件时,我想从它停止的地方继续 - 从之前的位置读取。

为了演示,我会给你一个小例子(实际上它更复杂):

master_list = [['one','two','three'],[1, 2, 3],['foo','bar','nothing']]

现在我想做点什么:

rand_master_list = random.choice(master_list)

while True:
    for item in rand_master_list:
        print item
        break

break声明是因为我想跳出for循环,因此rand_master_list与之前的不同。

但我不能做我需要的。我想得到这个输出例如:

one         # prints master_list[0][0]
foo         # prints master_list[2][0]
1           # prints master_list[1][0]
bar         # randomly selects but it doesn't start with 'foo' but keeps
            # going in the list master_list[2][1]
two         # print master_list[0][1] again notice the item order is
            # unchanged but the list containing items was randomly selected

等。你明白了。我无法弄清楚如何保持上次读取列表的状态。我希望它不会太混乱。另外,我不知道master_list会是什么样子,每次都会更改,所以我不能使用任何“特定”的东西,master_list中的项目列表的数量每次都会有所不同以及那些内部的物品数量。

1 个答案:

答案 0 :(得分:1)

iterator依次产生一个列表(或任何其他可迭代的)的每个项目,跟踪它的位置。您可以使用内置的iter()函数在列表(或任何其他可迭代的)上创建迭代器,然后使用next()依次获取其项目。

以下是如何使用迭代器来实现目标的方法:

import random

list_of_lists = [
    ['one', 'two', 'three'],
    [1, 2, 3],
    ['foo', 'bar', 'nothing']
]

list_of_iters = [iter(s) for s in list_of_lists]

while list_of_iters:
    key = random.randrange(0, len(list_of_iters))
    random_iter = list_of_iters[key]
    try:
        item = next(random_iter)
    except StopIteration:
        del list_of_iters[key]
        continue
    print(item)

请注意,当迭代器耗尽时,它会引发StopIteration,并在上面的代码中捕获该异常并从list_of_iters中删除耗尽的迭代器。如果list_of_iters为空,则评估为Falsewhile循环终止。