【问题标题】:Python shelve and random iteratorPython搁置和随机迭代器
【发布时间】:2015-08-02 21:17:25
【问题描述】:

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

导入搁置

# 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

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

【问题讨论】:

    标签: python iterator iterable shelve


    【解决方案1】:

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

    iterator = list(d)
    shuffle(iterator)
    

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

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

    【讨论】:

    • 谢谢!掌握迭代器的窍门!
    【解决方案2】:

    您只需从底层 dict 实现中获取未定义的顺序。试试这个,适用于任何类似字典:

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

    编辑:正如@Padraic Cunningham 在评论中指出的那样,his answer 是更好的选择。不仅在 Python3 中也可以使用,而且更加简洁。

    【讨论】:

    • list(d) 正是您的代码正在执行的操作,并且适用于 python 2 和 3,这不适用于 python3
    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2012-03-04
    • 2015-02-10
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多