【发布时间】:2016-04-01 03:22:41
【问题描述】:
我有一个整数列表,如下所示:
unculledlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
我想从这个列表中剔除值,使它看起来像这样:
culledlist = [0, 2, 4, 10, 12, 14, 20, 22, 24]
但我想通过使用列表推导来做到这一点。
这是我尝试剔除列表值的图形预览。如果我将列表值排列成行和列,会更容易理解。但这只是视觉上的。我不需要嵌套列表:
我可以通过使用两个嵌套循环来做到这一点:
unculledlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
index = 0
culledlist = []
for i in range(6):
for j in range(5):
if (i % 2 == 0) and (j % 2 == 0):
culledlist.append(unculledlist[index])
index += 1
print "culledlist: ", culledlist # culledlist = [0, 2, 4, 10, 12, 14, 20, 22, 24]
但我想用 python 列表推导来代替。
谁能提供一个例子吗?
谢谢。
编辑:
我想使用列表推导的原因是因为我的实际unculledlist 有几百万个整数。用列表推导解决这个问题肯定会加快速度。我不关心可读性。我只是想制定一个更快的解决方案。
我不能使用 numpy 和 scipy 模块。但我可以使用itertools 模块。不确定使用 itertools 的解决方案是否比使用列表理解的解决方案更快?甚至lambda?
【问题讨论】:
-
基本就是测试row index是否偶数,item index是否偶数。
-
从模块中导入特定的函数、类或任何时候是
from module_name import something,所以在这种情况下是from itertools import ifilter,或者如果你打算使用其他东西,你可以将整个模块导入为import itertools从那里使用它作为itertools.ifilter(...)。当您执行import name1.name2时,您正在尝试从包名称1 导入模块名称2,在这种情况下是错误的,因为ifilter 是模块中的一个函数,而不是模块本身... -
是的,这就是重点,ifilter 制作了一个生成器,这是一个惰性函数,仅在被要求时才产生结果,因此内存友好且仅使用少量内存,以防万一想要对每个过滤的元素进行一些复杂的演算,就像在 for 循环中一样。 itertools 模块中的每个函数都执行相同的操作。要获得整个结果,请执行
list(ifilter(...))或在 2.7 中使用过滤器,如果您不想要这样的功能 -
在python 2.7中
filter给出整个结果,ifilter给出一个生成器,如果这个操作的结果是你的最终结果,那么使用filter或列表理解,但如果它是一个要获得最终结果,您最好使用ifilter或通常使用生成器来节省内存和时间。作为附加说明,如果您参与创建unculledlist,您可以使用像xrange这样的生成器来构建它并保存在不需要的东西中使用的内存,或者如果您有完全控制权,最好直接构建culledlist无论何时……