我想建立一个新的列表,其中遗漏了初始列表的每个第n个元素,例如:
来自['first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh']
的
将['second', 'third', 'fifth', 'sixth'
n = 3
怎么做?
它是 - 首先 - 通过建立一个新的列表而不是试图删除来实现这一点是正确的吗?对于后者,我尝试了deque
和rotate
,但最终陷入混乱
为了建立一个新的列表,我正在尝试使用range(1,len(list),n)
,但这是要删除的元素位置,而不是要为新列表保留的元素位置。
如何获得我想要的清单?
答案 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']