Search code examples
pythoniteratoriterableshelve

Python shelve and random iterator


I want to create an iterator for a shelve key-value store that can be used multiple times but each time returns values in a different order. A shelve iterator returns values in a random order but the order doesn't change on each invocation. Here is an example:

import shelve

# 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

How can I get the shelve iterator to return values in a different order each time (eg. using random.shuffle)?


Solution

  • If you want to call shuffle you need to make iterator a list:

    iterator = list(d)
    shuffle(iterator)
    

    shuffle expects a list so you need to pass it one by call list on d to get a list of keys.

    You also don't need to call iter unless you actually want an iterator, you could just iterate over d.