3 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
AnOrderedDict可以很好地替代保留訂單的集合,因?yàn)殒I視圖類似于集合:
>>> from collections import OrderedDict
>>> list1 = ['1','2','3','4','7','8']
>>> list2 = ['1','2','3','4','5','6']
>>> OrderedDict.fromkeys(list1).keys() - OrderedDict.fromkeys(list2).keys()
{'7', '8'}
>>> OrderedDict.fromkeys(list2).keys() - OrderedDict.fromkeys(list1).keys()
{'5', '6'}
嚴(yán)格來說,這可能仍在使用CPython的實(shí)現(xiàn)細(xì)節(jié)。但是列表理解不是,它們?nèi)匀皇荗(n):
>>> od1 = OrderedDict.fromkeys(list1)
>>> od2 = OrderedDict.fromkeys(list2)
>>> [k for k in od1 if k not in od2]
['7', '8']
>>> [k for k in od2 if k not in od1]
['5', '6']

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
您可以使用列表推導(dǎo):
list1 = ['1','2','3','4','7','8']
list2 = ['1','2','3','4','5','6']
set1 = set(list1) # convert to set for faster membership testing
result = [x for x in list2 if x not in set1]
# result: ['5', '6']
但是,這將包括重復(fù)的元素:
>>> list1 = [1]
>>> list2 = [1, 2, 2]
>>> set1 = set(list1)
>>> [x for x in list2 if x not in set1]
[2, 2]
如果不需要重復(fù),只需將列表理解轉(zhuǎn)換為循環(huán)并跟蹤已遇到的所有元素:
list1 = [1]
list2 = [1, 2, 2]
set1 = set(list1)
result = []
for x in list2:
if x in set1:
continue
result.append(x)
set1.add(x)
# result: [2]

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
盡管此操作不使用-運(yùn)算符進(jìn)行設(shè)置,但它確實(shí)保留了原始列表的順序。
list1 = ['1','2','3','4','7','8']
list2 = ['1','2','3','4','5','6']
set_list2 = set(list2)
result = []
for item in list1:
if not item in set_list2:
result.append(item)
set_list2.add(item) # to avoid duplicates in result
print(result)
# ['7', '8']
添加回答
舉報(bào)