我已经浏览了这篇文章: Python: building new list from existing by dropping every n-th element,但由于某种原因,它对我不起作用:
我试过这种方式:
def drop(mylist, n):
del mylist[0::n]
print(mylist)
此函数采用列表和n
。然后它通过使用列表中的n步来删除每个第n个元素并打印结果。
这是我的函数调用:
drop([1,2,3,4],2)
输出错误:
[2, 4]
代替[1, 3]
然后我尝试了以上链接的变体:
def drop(mylist, n):
new_list = [item for index, item in enumerate(mylist) if index % n != 0]
print(new_list)
再次,函数调用:
drop([1,2,3,4],2)
给我同样错误的结果:
[2, 4]
代替[1, 3]
如何从列表中正确删除/删除/删除每个第n个项?
答案 0 :(得分:7)
假设您有列表:
a = [1,2,3,4,5,6,7,8,9,10]
如果您想要每个第k个元素,您可以执行类似
的操作del a[k-1::k]
k = 3
的例子目前的清单现在是[1, 2, 4, 5, 7, 8, 10]
答案 1 :(得分:5)
输出正确,您要删除索引为0,n,2n,...的元素。因此删除了1和3,剩下2和4。因此,如果要打印0,n,2n,...元素,只需写入
print(mylist[::n])
答案 2 :(得分:2)
你的第一种方法看起来对我很好 - 你只需要调整你的起始索引,如果你想放弃元素1,1 + n,1 + 2n,......(似乎就是这种情况):
lst = list(range(1, 5))
del lst[1::2]
print(lst)
答案 3 :(得分:2)
在您的第一个函数中mylist[0::n]
是[1, 3]
,因为0::n
表示第一个元素为0,其他元素在第一个元素之后是每个 th 元素。正如Daniel建议您可以使用mylist[::n]
,这意味着每个 元素。
在你的第二个函数索引中,从0开始,0 % 0
为0,因此它不会复制第一个元素。对于第三个元素(2 % 2
为0)也是如此。所以你需要做的只是new_list = [item for index, item in enumerate(mylist) if (index + 1) % n != 0]
提示:您可能希望在这些功能中使用return
而不是print()
。
答案 4 :(得分:1)
另一种方法是生成一个只包含所需元素的新列表。
newList = [x for i, x in enumerate(myList) if i%n !=0]
如果n为5,则会返回包含元素[1,2,3,4,6,7,8,9,11 ...]的列表 这样做的好处是,如果要重用数据,保留原始列表是有用的。但是,如果你担心节省内存,那么可能不是最好的。