【问题标题】:python filter calculated values from large lists to create multiple smaller listspython从大列表中过滤计算值以创建多个较小的列表
【发布时间】:2011-08-09 20:15:01
【问题描述】:

我想找到一种最佳方法来处理非常大的有序整数列表,例如。

biglist = [45, 34, 2, 78, 7, 9, 10, 33, 78, 51, 99, 24, 88, ... N] where N > 1m

通过读取每个 biglist 元素来创建多个固定长度 S (~=200) 的小列表,对元素应用不同的操作,如果满足条件标准,则将元素或值添加到每个小列表中,直到达到 S例如。

x_smallist = []
y_smallist = []
z_smallist = []
count = 0
for i in biglist:
    b = i / 5
    a = b * 2
    c = a^3 + b
    if b > 7 and b < 69:
        x_smallist.append(i)
        y_smallist.append(a)
        z_smallist.append(b)
        count += 1
    if count > S:
        break

示例和功能仅用于说明。由于 biglist 很大,并且每个元素都被读取和操作,直到达到 S,并且该过程重复数千次,我想避免 for 循环。如何通过列表理解(或映射或过滤器)来实现这一点?

【问题讨论】:

  • 如果你对每个元素做这么多的处理,a) 你将无法在列表推导中表达它,并且 b) 列表推导所节省的时间将相形见绌无论如何你必须做的真正工作。
  • 这最好作为for 循环来完成。列表推导式和filter 适用于不需要abcount 等中间变量的情况。我唯一可能的让它更快的建议是有一个列表,你可以将元组附加到:smallist.append((i, a, b))
  • 对列表进行预过滤似乎很简单。

标签: python list filter list-comprehension


【解决方案1】:

我认为下面应该做你想要的,这可以通过让生成器为每个列表生成一个包含一个新元素的元组,然后使用 zip 创建你想要的三个列表。 biglist 的迭代器在开始时被创建,这样每次循环你都会从你离开的地方继续,并使用 islice 以便生成器在 S 元素处停止。

itr = iter(biglist)
while True:
    lists = itertools.islice(((i, i/5*2, i/5) for i in itr if 7 < i/5 < 69), S)
    x_smallist, y_smallist, z_smallist = zip(*lists)
    if len(x_smallist) == 0:
        break       # reached the end of biglist
    # do stuff with your small lists

【讨论】:

    【解决方案2】:

    biglist 真的必须是一个列表吗?如果您可以使用生成器创建它们,则可以节省内存,也许还可以节省一些时间。

    【讨论】:

    • biglist 可以是任何合适的数据结构,但元素是预先计算和排序的。
    【解决方案3】:
    S = 200
    import itertools
    biglist = itertools.islice(itertools.ifilter(lambda x: 7 < x/5 < 69, biglist),S)
    

    或者如果你想要多个块,只需应用 ifilter 然后循环结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多