我正在创建一个小脚本,它将获取一个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
中的项目列表的数量每次都会有所不同以及那些内部的物品数量。
答案 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
为空,则评估为False
,while
循环终止。