2017-01-11 488 views
1

我試過this post但它似乎不適合我。刪除列表中的重複項目

我試過這段代碼:

for bresult in response.css(LIST_SELECTOR): 
    NAME_SELECTOR = 'h2 a ::attr(href)' 
    yield { 
     'name': bresult.css(NAME_SELECTOR).extract_first(), 
    } 
                        b_result_list.append(bresult.css(NAME_SELECTOR).extract_first()) 

    #set b_result_list to SET to remove dups, then change back to LIST 
    set(b_result_list) 
    list(set(b_result_list)) 
for brl in b_result_list: 
    print("brl: {}".format(brl)) 

此打印出:

brl: https://facebook.site.com/users/login 
brl: https://facebook.site.com/users 
brl: https://facebook.site.com/users/login 

當我只需要:

brl: https://facebook.site.com/users/login 
brl: https://facebook.site.com/users 

什麼我錯在這裏做什麼?

謝謝!

回答

7

你丟棄的結果,當你需要保存它... b_result_list實際上從未改變...所以你只是遍歷原始列表。而不是保存set操作的結果

b_result_list = list(set(b_result_list)) 

(注意:set■不要維持秩序)如果你想維持秩序,uniqueify

+0

哇,傻我。我一定累了。謝謝@Joran!我儘快接受 – Jshee

+1

這裏,沒有必要輸入'set'回到'list' –

+0

@MoinuddinQuadri,這可能是真的......但我並不想作出暗示 –

1

,你可以這樣做:

>>> li 
['1', '1', '2', '2', '3', '3', '3', '3', '1', '1', '4', '5', '4', '6', '6'] 
>>> seen=set() 
>>> [e for e in li if not (e in seen or seen.add(e))] 
['1', '2', '3', '4', '5', '6'] 

或者,您可以使用OrderedDict的按鍵:

>>> from collections import OrderedDict 
>>> OrderedDict([(k, None) for k in li]).keys() 
['1', '2', '3', '4', '5', '6'] 

B單獨一組可能會大大改變原始列表的順序:

>>> list(set(li)) 
['1', '3', '2', '5', '4', '6']