簡體   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