在python中,有没有一种好的方法来获取两个排序列表的对称差并返回一个排序列表。我当前的版本似乎是一个糟糕的解决方法(转换到set,找到对称差分,转换回list,然后求助)
使用Numpy的解决方案很好,正在排序的数据类型是int。在
sorted_symdiff(list1,list2):
""" Each list is already sorted, this seems inefficient """
s1,s2 = set(list1),set(list2)
diff = list(s1.symmetric_difference(s2))
diff.sort()
return diff
是的,有办法。您必须利用这两个序列是排序的这一事实。您需要遍历这两个元素,同时逐个比较元素,并在沿着每个序列前进时构造对称差分。在
如果您熟悉big O符号,以下代码的复杂性是}
O(m+n)
,其中m = len(seq1)
和{算法的复杂性是
O(log(m+n)*(m+n))
,因为您需要对结果集进行排序。在代码:
测试:
^{pr2}$输出:
永远不要相信
set
会被排序。当您希望返回已排序的list
时,总是在将set
转换为list
对象之后进行排序。我不确定我在下面的解释中观察到的行为。转换回列表后不需要排序,因为列表已经排序。删除额外的排序将使其效率更高。在如果},则结果需要再次排序。在
list1
和list2
被保证是正的int
对象的排序列表,那么得到的symmetric_difference
set
似乎返回了python3.5中的sorted。如果list1
和list2
包含任何负数int
或{相关问题 更多 >
编程相关推荐