2017-06-22 70 views
1

我有一個n元素列表(可以整除爲56)。從56個元素的每個「步驟」中,我想在每個步驟中刪除相同索引上的特定元素:假設我有一個280個元素的列表,我想用56個元素分隔它,這將是5個列表。並從每個列表中刪除特定的索引(例如下面的索引變量)。Python在重複步驟中從列表中刪除特定元素

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

給出一個真實簡單的例子。也許是20個元素的列表和7或某些這樣的步驟。根據你想要的結果給出樣本輸入和輸出不清楚。 –

回答

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

這就是交配。感謝您捕捉我的想法,即使我無法解釋他們:) –

1

使用a 列表理解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尖端:製作index名單一組將降低會員查找複雜Ø(1)。

+0

感謝隊友,但事實並非如此。假設我在my_list中有224個元素。我想從[0:56]迭代並在每次迭代中移除對應於索引列表的元素。 –

+0

你只想一次或多次檢查切片'[0:56]'? –

+0

是的,反覆:) –

0

我不完全確定我理解你的問題。我得到它的方式,你想從index列表中刪除my_list中的第56個元素。如果這是正確的,您應該使用片[0::56],而不是[0:56]。後者會給你第56個元素。

這裏有一個簡單的例子,除去每2元,有兩份名單是相同的,使得它更容易保持發生了什麼的軌道:

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