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)?
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
.