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

4

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

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

如何实现呢? 首先,通过建立新列表来完成这个任务是否正确,而不是尝试删除?对于后者,我尝试使用dequerotate,但结果令人困惑。
为了建立一个新列表,我尝试使用range(1,len(list),n),但这些是要删除的元素位置,而不是新列表中要保留的元素。

如何获得所需的列表?


你是以循环方式删除它们吗? - Ashwini Chaudhary
Hai Vu做得很好,正是我想要的。(Jon S.和Muhammad Alkarouri的意思是一样的,我猜) - solarisman
我在他之前8分钟就给出了相同的答案,问题出在哪里? - Muhammad Alkarouri
2
如果我是你,我应该接受Muhammad Alkarouri的答案(https://dev59.com/onHYa4cB1Zd3GeqPP8yi#16406859),Hai Vu的答案只是它的复制(可能不是故意的)。 - Ashwini Chaudhary
Muhammad Alkarouri,你太棒了!我刚给你打了个勾。伙计们,你们的速度太快了,我来不及阅读和理解。 - solarisman
不用担心,solarisman。感谢你的冷静,@AshwiniChaudhary。 - Muhammad Alkarouri
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')]

然后您检查索引是否不能被三整除,如果是,则包括该项。


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() 函数会选择那些不为零的项目。


是的。故事的短版就是我有点不恭。抱歉。 - Muhammad Alkarouri
对不起,我可能听起来有点严厉。 - Hai Vu

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']

1
你可以使用列表推导式来完成这个任务。
def drop_items(l, n):
    return [x[1] for x in enumerate(l) if x[0] % n]

解释:

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

index % n != 0

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

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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接