我想找到一种处理非常大的有序整数列表的最佳方法,例如。
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循环。如何通过列表理解(或地图或过滤器)实现这一目标?
答案 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