Python:通过删除每个第n个元素从现有构建新列表

时间:2013-05-06 20:30:34

标签: python list

我想建立一个新的列表,其中遗漏了初始列表的每个第n个元素,例如:

来自['first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh']

['second', 'third', 'fifth', 'sixth'

设为n = 3

怎么做? 它是 - 首先 - 通过建立一个新的列表而不是试图删除来实现这一点是正确的吗?对于后者,我尝试了dequerotate,但最终陷入混乱 为了建立一个新的列表,我正在尝试使用range(1,len(list),n),但这是要删除的元素位置,而不是要为新列表保留的元素位置。

如何获得我想要的清单?

5 个答案:

答案 0 :(得分:9)

>>> [s for (i,s) in enumerate(['first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh']) if i%3]
['second', 'third', 'fifth', 'sixth']

答案分几步:

enumerate函数给出了一个元组列表,其中索引后跟项目:

>>> list(enumerate(['first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh']))
[(0, 'first'), (1, 'second'), (2, 'third'), (3, 'fourth'), (4, 'fifth'), (5, 'sixth'), (6, 'seventh')]

然后检查索引是否除以3,如果是,则包括该项。

答案 1 :(得分:5)

您可以同时创建新列表并进行过滤:

>>> li = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh']
>>> new_list = [item for index, item in enumerate(li) if index % 3 != 0]
>>> new_list
['second', 'third', 'fifth', 'sixth']

讨论

enumerate(li)返回元组列表:(index,item):

[(0, 'first'), (1, 'second'), (2, 'third'), (3, 'fourth'), (4, 'fifth'), (5, 'sixth'), (6, 'seventh')]

我们只挑选索引为%3!= 0的项目,这意味着删除索引为0,3,6的项目......

更新:不同的解决方案

如果您不介意使用itertools:

>>> import itertools
>>> list(itertools.compress(li, itertools.cycle(range(3))))
['second', 'third', 'fifth', 'sixth']

cycle(range(3))返回无限列表:

[0, 1, 2, 0, 1, 2, ...]

compress()选出那些非零的项目。

答案 2 :(得分:2)

我使用扩展切片投入变体:

>>> li=['first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh']
>>> nl=[None]*(len(li)*2/3)
>>> nl[0::2],nl[1::2]=l[1::3],l[2::3]
>>> nl
['second', 'third', 'fifth', 'sixth']

您也可以使用itertools:

>>> from itertools import chain
>>> list(chain(*zip(l[1::3],l[2::3])))
['second', 'third', 'fifth', 'sixth']

答案 3 :(得分:1)

您可以使用列表推导来执行此操作。

def drop_items(l, n):
    return [x[1] for x in enumerate(l) if x[0] % n]

说明:

我们想要返回索引不是n的倍数的所有项目。因此,我使用枚举来遍历列表,因为这让我可以使用索引以及项目。如果

,则项目不是n的倍数
index % n != 0

因此,我将此作为是否在新列表中包含该项目的条件。

答案 4 :(得分:0)

为了完成,您可以使用过滤器:

>>> l=['first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh']
>>> [t[1] for t in filter(lambda t: t[0]%3, enumerate(l))]
['second', 'third', 'fifth', 'sixth']
相关问题