python过滤大型列表中的计算值以创建多个较小的列表

时间:2011-08-09 20:15:02

标签: python list filter list-comprehension

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

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循环。如何通过列表理解(或地图或过滤器)实现这一目标?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

S = 200
import itertools
biglist = itertools.islice(itertools.ifilter(lambda x: 7 < x/5 < 69, biglist),S)

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

答案 2 :(得分:0)

我认为以下应该做你想做的事情,这可以让一个生成器产生一个元组,每个列表都有一个新元素,然后用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