我有一个整数列表,内容如下:
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
?
import itertools.ifilter
后,在Python 2.7和IronPython 2.7中都收到了ImportError: No module named ifilter
的消息。你知道为什么会发生这种情况吗? - marcofrom module_name import something
的语法,因此在这种情况下,应该使用from itertools import ifilter
。或者,如果您计划使用该模块中的其他内容,则可以将整个模块导入为import itertools
,然后使用itertools.ifilter(...)
。当您执行import name1.name2
时,您正在尝试从包名1中导入模块name2,但在这种情况下是错误的,因为ifilter是模块中的一个函数而不是模块本身... - Copperfieldlist(ifilter(...))
或者如果您不需要这样的功能,则在 2.7 中使用 filter。 - Copperfieldfilter
会返回整个结果,而ifilter
则返回一个生成器。如果该操作的结果是您的最终结果,则使用filter
或列表推导式;但如果它是获取最终结果的步骤,则最好使用ifilter
或通常使用生成器来节省内存和时间。另外,如果您参与创建unculledlist
,可以使用像xrange
这样的生成器来构建它并节省不必要的内存,或者更好的方法是,如果您完全控制了何时进行操作,直接构建culledlist
。 - Copperfield