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

时间:2017-06-22 15:25:20

标签: python list python-3.x loops

我有一个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个元素的步骤,并从索引变量中删除那些特定的索引。在此先感谢,也许力量与你同在!

3 个答案:

答案 0 :(得分:1)

使用列表推导enumerate同时生成索引和项目。在56上获取索引的可以得到0到55之间的数字,可以根据index列表中的值进行过滤:

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

请注意,索引从0开始。如果您的index列表未考虑此问题,则可以将start 1传递给enumerate

Pro-Tip :使index列出一个集合会将成员资格查找复杂性降低到 O (1)。

答案 1 :(得分: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]]

答案 2 :(得分:0)

我不完全确定我理解你的问题。我得到它的方式,你想从my_list列表中删除index中的每个第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中的那些元素(如你的代码所示),你可以使用它:

>>> 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]