使用python list comprehensions从列表中删除项目

时间:2015-12-26 18:01:25

标签: python list

我有一个整数列表,如下所示:

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]

但我想通过使用列表推导来做到这一点。

这是我试图剔除列表值的图形预览。如果我将列表值排列成行和列,则更容易理解。但这只是视觉上的。我不需要嵌套列表: enter image description here

我可以通过使用两个嵌套循环来实现:

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

4 个答案:

答案 0 :(得分:7)

我看到了这一点,并认为字符串操作将是更容易的方法

culled_list = [item for item in unculledlist if str(item)[-1] in ['0','2','4']]

结果仍然是整数列表

>>> culled_list
[0, 2, 4, 10, 12, 14, 20, 22, 24]

感谢eugene y采用不那么复杂的方法

>>> culled_list = [item for item in unculledlist if item % 10 in (0,2,4)]
>>> culled_list
[0, 2, 4, 10, 12, 14, 20, 22, 24]

答案 1 :(得分:3)

你可以使用这样的列表理解来做到这一点:

[x for i, x in enumerate(unculledlist) if (i % 6) % 2 == 0 if (i % 5) % 2 == 0]

输出结果为:

[0, 2, 4, 10, 12, 14, 20, 22, 24]

答案 2 :(得分:3)

你可以用5项块读取列表,并从每个偶数块中提取偶数索引的元素:

>>> [x for i, v in enumerate(range(0, len(unculledlist), 5)) if not v % 2 for x in unculledlist[v:v+5:2]]
[0, 2, 4, 10, 12, 14, 20, 22, 24]

答案 3 :(得分:3)

getState()

当我分析模式时,我意识到排除5,15,25的行。我这样做了;

culledlist = [num for num in unculledlist if not (num / 5) % 2 and not num % 2]

每行返回1,如[5,6,7,8,9]或[15,16,17,18,19]

在从0,10,20开始的其他行(从上面的等式返回0)中没有完全排除,而是仅排除了奇数值。我是这样做的;

(num / 5) % 2

由于第一个等式已经满足,所以取基本num%2可以正常工作。我没有使用任何;

num % 2
# Returns zero with even values.

因为0和1已经作为布尔值。