Python 搁置和随机迭代器

Python shelve and random iterator

我想为可多次使用但每次 returns 值以不同顺序使用的搁置键值存储创建一个迭代器。搁置迭代器 returns 的值以随机顺序排列,但顺序不会在每次调用时改变。这是一个例子:

进口货架

# store key-value pairs with shelve
d = shelve.open('kv_store')
kv = {'a': 9, 'b': 8, 'c': 7, 'd': 6}
for key in kv.keys():
    d[str(key)] = kv[key]
d.close()

# create iterator for key-value store
d = shelve.open('kv_store')
iterator = iter(d)
for i in iterator:
    print(i)
d.close()

> b
> d
> a
> c

# repeat create iterator for key-value store
d = shelve.open('kv_store')
iterator = iter(d)
for i in iterator:
    print(i)
d.close()

> b
> d
> a
> c

如何让搁置迭代器每次以不同的顺序指向 return 值(例如,使用 random.shuffle)?

如果你想调用 shuffle 你需要让迭代器成为一个列表:

iterator = list(d)
shuffle(iterator)

shuffle 需要一个列表,因此您需要通过 d 上的调用列表传递一个列表以获取键列表。

你也不需要调用 iter 除非你真的想要一个迭代器,你可以迭代 d

你只是从底层字典实现中得到了未定义的顺序。试试这个,适用于任何类似 dict 的东西:

def random_dict_iter(x):
    _x = x.keys()
    random.shuffle(_x)
    return _x           # or if you like: return iter(_x)

编辑:正如@Padraic Cunningham 在评论中指出的那样, 更好。不仅在Python3也行,而且更简洁