如何使用“设置”保持有序列表?

我希望能够在比较时保持列表的顺序。请注意,当我将list1与list2比较时,它返回的是8,然后是7(反向)。如何维护订单?


>>> list1 = ['1','2','3','4','7','8'] 

>>> list2 = ['1','2','3','4','5','6']

>>> list(set(list2) - set(list1))    

['5', '6']

>>> list(set(list1) - set(list2))    

['8', '7']


胡说叔叔
浏览 155回答 3
3回答

ABOUTYOU

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

守候你守候我

您可以使用列表推导:list1 = ['1','2','3','4','7','8'] list2 = ['1','2','3','4','5','6']set1 = set(list1)  # convert to set for faster membership testingresult = [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]

jeck猫

尽管此操作不使用-运算符进行设置,但它确实保留了原始列表的顺序。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 resultprint(result)# ['7', '8']
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python