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