繁体   English   中英

Python在重复步骤中从列表中删除特定元素

[英]Python remove specific elements from list on repeated steps

我有n个元素的列表(可除以56)。 从56个元素的每个“步骤”中,我想在每个步骤中删除相同索引上的特定元素:。 假设我有一个280个元素的列表,我想用56个元素将其分开,即5个列表。 并从每个列表中删除特定的索引(例如,下面的索引变量向下)。

index = [1, 8, 14, 21, 28, 35, 42, 49]

my_list = ['4','5', '3', '7'.... '1'] #at least 56 elements
len(my_list) # Out: 280, for example
new_l = []


for i in my_list[0:56]:
     if i not in index:
        new_l.append(i)

我想反复遍历my_list步骤,使用56个元素,并从索引变量中删除那些特定的索引。 在此先感谢您,并祝您一切顺利!

使用列表理解enumerate同时生成索引和项目。 对56进行索引取 ,可以得到0到55之间的数字,该数字可用于根据index列表中的值进行过滤:

new_l = [x for i, x in enumerate(my_list) if i%56 not in index]

请记住,索引从0开始。如果您的index列表没有考虑到这一点,则可以传递1 startenumerate

Pro-Tip :将index列表设为一组将把成员资格查找的复杂度降低到O (1)。

似乎您正在尝试同时分块和过滤列表。

indices = [1, 3, 5]
s = 6
t = list(range(30))

[[v for j, v in enumerate(t[i:i+s]) if j not in indices] for i in range(0, len(t), s)]
# [[0, 2, 4], [6, 8, 10], [12, 14, 16], [18, 20, 22], [24, 26, 28]]

我不确定我是否理解您的问题。 我得到它的方式是,要从index列表中删除my_list中的每个第56个元素。 如果正确,则应使用切片[0::56] ,而不要使用[0:56] 后者将为您提供前56个元素。

这是一个简化的示例,删除了每个第二个元素,并且两个列表都相同,因此更容易跟踪正在发生的事情:

>>> index = [1, 8, 14, 21, 28, 35, 42, 49]
>>> my_list = [1, 8, 14, 21, 28, 35, 42, 49]
>>> to_remove = set(my_list[0::2])  # {1, 14, 28, 42}
>>> [x for x in index if x not in to_remove]
[8, 21, 35, 49]

在您的情况下,您可以使用to_remove = set(my_list[0::56]) 此处, 0是起始索引(默认为0 ),而56为元素之间的间隔(默认为1 )。

相反,如果您想保留那些不在index中的第56个元素(如您的代码所示),则可以使用以下方法:

>>> index_set = set(index)
>>> [x for x in my_list[0::56] if x not in index_set]

好吧,我想我现在已经得到了您想要的:

>>> index = [1, 3]
>>> my_list = list(range(20))
>>> [x for n in range(0, len(my_list), 5) 
       for i, x in enumerate(my_list[n:n+5]) if i not in index]
[0, 2, 4, 5, 7, 9, 10, 12, 14, 15, 17, 19]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM