如何 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...] 的列表
这样做的好处是您可以保留原始列表,这在您要重用数据时很有用。但是,如果您担心节省内存,那可能不是最好的选择。
我已经看过这个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...] 的列表 这样做的好处是您可以保留原始列表,这在您要重用数据时很有用。但是,如果您担心节省内存,那可能不是最好的选择。