在Python中以o(n)顺序对大列表进行快速列表减法

时间:2019-05-11 09:50:46

标签: python list subtraction

我在python中有两个大字符串列表。我想以o(n)的顺序快速减去这两个列表。我发现了某种方法,例如从第一个列表中循环删除第二个列表元素,或将列表转换为set()(问题:列表的更改顺序)并使用minus(-)运算符,但这些方法效率不高。有什么方法可以执行此操作吗?

a=['1','2','3',...,'500000']
b=['1','2','3',...,'200000']

c=a-b

c=['200001','200002',...,'500000']

1 个答案:

答案 0 :(得分:1)

您提出的问题是:

  • 通过A
  • 对于每个元素,在B中进行搜索,并在找不到的情况下使用
  • 不对元素做任何假设

对于任意数据,列表搜索为O(N),集合搜索为O(1),转换为集合为O(N)。通过A的是O(N)。

因此,它是仅具有列表的O(N ^ 2)和将B转换为集合的O(N)。

加快速度的唯一方法是提高迭代效率或搜索效率-如果不使用有关数据的其他知识,这是不可能的。例如

  • 在您的示例中,您的数据是连续数字,因此您可以输入A[len(B):]
  • 如果您要多次使用同一个B,则可以缓存集合
  • 您可以立即将B设为集合(如果需要保留订单,则可以使用an ordered set
  • 如果所有数据都属于同一类型且较短,则you can use numpy arrays及其快速setdiff1d