2017-04-09 20 views
-2

我正在寫一段代碼,應該帶有幾個數字的列表(例如:[2,3,5,6,6]),並創建一個新列表,刪除所有重複項(以[2,3,5,6]結尾)。Python - 如果陳述內的列表理解

我的代碼是這樣的:

first_list = [2,3,5,6,6] 
second_list = [] 
second_list = [x for x in first_list if x not in second_list] 

然而,它使second_list等於first_list,我不明白爲什麼。我怎樣才能使它做我上面解釋的?

+0

的無的'x'是在當理解力,原因很簡單,第二列表是空的評估的第二列表。 –

+0

當你的'second_list'將被empyt時,在列表理解期間它不會被更新。 – bhansa

回答

1

只需使用集而不是列表刪除重複:

first_list = [2,3,4,5,6,6] 
first_set = set(first_list) 
print(first_set) 

集不能包含重複

+0

我是一名初學者,所以我甚至不知道套。這工作正常,謝謝:) –

+0

這假定元素的順序是不相關的。 –

+0

我剛剛做了'newList = list(first_set) newList.sort()' –

2

分配給second_list發生後的列表理解已經完成。它不會逐步建立second_list。你所寫的,相當於做:

# this does not give the answer you want: 
temp = [x for x in first_list if x not in second_list] 
second_list = temp 

這是因爲列表解析之前在內存中構建完整列表將其分配給second_list。如果您想在建立時檢查列表,可以使用append的常規循環。

second_list = [] 
for x in first_list: 
    if x not in second_list: 
     second_list.append(x) 

對於一個更快的方法,使用set

second_list = list(set(first_list)) 

然而,這並不一定保留的first_list

+0

這不起作用... –

+0

第一個代碼塊解釋了爲什麼它不起作用。使用正確方法的第二個或第三個代碼塊。 – James

1

訂單要刪除所有重複,最好是使用set() ,像這樣:

first_list = [2, 3, 5, 6, 6] 
second_list = list(set(first_list)) 

現在,second_list包含所有你需要

如果要使用循環:如果您需要維持秩序

first_list = [2, 2, 3, 4, 6, 6] 
second_list = [] 
final_list = [] 
for i in first_list: 
    if i not in second_list: 
     final_list.append(i) 
     second_list.append(i) 

print final_list 
0

,一個方法是使用一個OrderedDict,如:

代碼:

second_list = OrderedDict([(x, None) for x in first_list]).keys() 

測試代碼:

from collections import OrderedDict 
first_list = [2, 3, 5, 6, 6] 
second_list = OrderedDict([(x, None) for x in first_list]).keys() 
print(second_list) 

結果:

[2, 3, 5, 6]