如何 remove/delete 列表中的每个第 n 个元素?

How to remove/delete every n-th element from list?

我已经看过这个post: 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]


然后我尝试了上面 link 的变体:

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]


如何正确 remove/delete/drop 列表中的每个 n-th 项?

输出正确,您正在删除索引为 0, n, 2n, ... 的元素。所以 1 和 3 被删除,2 和 4 被留下。所以如果你想打印 0, n, 2n, ... 元素,只需要写

print(mylist[::n])

我觉得你的第一种方法不错——如果你想删除元素 1、1+n、1+2n,你只需要调整你的起始索引(似乎是这样):

lst = list(range(1, 5))
del lst[1::2]
print(lst)

在你的第一个函数中 mylist[0::n][1, 3] 因为 0::n 意味着第一个元素是 0 而其他元素是每个 nth 元素之后第一的。正如 Daniel 建议的那样,您可以使用 mylist[::n],这意味着每个 nth 个元素。

在您的第二个函数中,索引从 0 开始,而 0 % 0 是 0,因此它不会复制第一个元素。第三个元素相同(2 % 2 为 0)。所以你需要做的就是new_list = [item for index, item in enumerate(mylist) if (index + 1) % n != 0]

提示:您可能希望在这些函数中使用 return 而不是 print()

假设您有列表:

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]

另一种方法是生成一个仅包含您需要的元素的新列表。

newList = [x for i, x in enumerate(myList) if i%n !=0]

如果 n 为 5,这将 return 一个包含元素 [1,2,3,4,6,7,8,9,11...] 的列表 这样做的好处是您可以保留原始列表,这在您要重用数据时很有用。但是,如果您担心节省内存,那可能不是最好的选择。