【问题标题】:Storing First X Items of a Large List (Python)存储大列表的前 X 项 (Python)
【发布时间】:2013-11-19 23:14:34
【问题描述】:

假设我们在 Python 中使用可迭代的组合生成了一个大列表,并且您想要检索具有某些属性的列表。

如果列表的列表足够大,仅生成列表将占用大部分计算时间。

有什么方法可以生成可迭代的前 x 个成员以减少总体计算时间?比方说:

y=50
z=[list(combo) for combo in combinations(range(y + 1), 11)]

假设我们有一个函数 A,当我们将 A 应用于 z 时,我们可以快速获得所需的列表。在计算 z 的每个成员之后,是否有一种方法可以应用函数 A?因此,不是首先计算整个列表,而是在创建单个项目时,函数对其进行评估?

更一般地说,是否有任何方法可以检索 z 的前 x 个成员,而不是整个列表?

【问题讨论】:

    标签: python list combinations combinatorics


    【解决方案1】:

    是的,使用itertools.islice 来限制数量。

    from itertools import islice
    
    combos = combinations(range(y + 1), 11)
    data = [list(combo) for combo in islice(combos, 100)]
    

    要从组合组合中取出前 100 个...然后您可以继续从 combos 消费...

    print next(combos) # next combination
    print list(islice(combos, 3, 13)) # skip 3 and take another 10
    

    【讨论】:

    • 我有点困惑。既然我们还在做combos=combinations(...),那计算不会还需要很长时间吗?不是还在生成整个列表吗?
    • @NoobCoder 如果您使用的是itertools.combinations 否...它是一个按需生成值的生成器...因此,我们只需要从它开始的 100 个值...所有combos = combinations(...) 是否设置了一个准备开始返回值的对象...然后我们根据需要从中获取它们...
    • @JonClements 哇!很棒的小费。这就是生成器和迭代器之间的区别吗?顺便说一句,请在答案中添加您的评论,它会增加价值,并有助于理解。
    • “生成器是一种特殊类型的迭代器”wiki.python.org/moin/Generators 我建议完整阅读此页面。你每次都会学到新东西。
    猜你喜欢
    • 2017-11-09
    • 2014-11-02
    • 1970-01-01
    • 2015-01-03
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    相关资源
    最近更新 更多