3 回答

TA贡献1812条经验 获得超5个赞
AnOrderedDict可以很好地替代保留订单的集合,因为键视图类似于集合:
>>> 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'}
严格来说,这可能仍在使用CPython的实现细节。但是列表理解不是,它们仍然是O(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贡献1802条经验 获得超10个赞
您可以使用列表推导:
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']
但是,这将包括重复的元素:
>>> list1 = [1]
>>> list2 = [1, 2, 2]
>>> set1 = set(list1)
>>> [x for x in list2 if x not in set1]
[2, 2]
如果不需要重复,只需将列表理解转换为循环并跟踪已遇到的所有元素:
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贡献1909条经验 获得超7个赞
尽管此操作不使用-运算符进行设置,但它确实保留了原始列表的顺序。
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']
添加回答
举报