4

我想建立一个新列表,其中初始列表的每个第 n 个元素都被省略,例如:

['first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh'] make['second', 'third', 'fifth', 'sixth'因为n = 3

怎么做?首先,通过建立一个新列表而不是尝试删除来实现这一点是否正确?对于后者,我尝试过dequerotate但结果很混乱。
为了建立一个新列表,我尝试了一些东西,range(1,len(list),n)但这是要删除的元素位置,而不是要为新列表保留的元素位置。

如何获得我想要的列表?

4

5 回答 5

10
>>> [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')]

然后检查索引是否不除以三,如果是,则包含该项目。

于 2013-05-06T20:36:11.250 回答
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)返回元组列表:(索引,项目):

[(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()挑出那些不为零的项目。

于 2013-05-06T20:45:07.547 回答
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']
于 2013-05-06T23:54:50.287 回答
1

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

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

解释:

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

index % n != 0

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

于 2013-05-06T20:38:46.847 回答
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']
于 2013-05-06T22:18:43.397 回答