【问题标题】:Comparing 2 lists out of order比较 2 个无序的列表
【发布时间】:2015-10-31 10:38:10
【问题描述】:

我想比较两个列表,例如 AB

A = [1,2,3]
B = [3,1,2]

我想编写一个函数来检查 A 中的所有项目是否都存在于 B 中。
即,对于上面的示例,该函数应返回 True
注意:我的列表中的项目是不可散列的对象。

为此,我写了这段代码:

for elem in A:
    if elem not in B:
        return False
return True

代码运行良好。
但我想要一种更高效、更 Pythonic 的方式来做到这一点。

【问题讨论】:

  • sorted(A) == sorted(B)?或者带有集合的东西,这取决于你的比较应该是什么(从那个微不足道的例子中不清楚)。
  • @jonrsharpe 我无法对列表进行排序。这只是一个例子。我正在处理列表中的不同对象。
  • 其实没问题,不做A = sorted(A)那么A就不会被排序了。
  • sorted 创建新列表。如果该示例不具有代表性,请展示一个具有代表性的示例。

标签: python list function python-3.x for-loop


【解决方案1】:

您可以使用all

all(i in B for i in A)

例子:

>>> A = [1,2,3]
>>> B = [3,1,2]
>>> all(i in B for i in A)
True
>>> B = [3,1,4]
>>> all(i in B for i in A)
False
>>> 

【讨论】:

  • 谢谢。这工作正常。但是,我不能提高时间复杂度吗?
  • @KshitijSaraogi:如果你想要更好的渐近复杂度,那么你必须使用其他数据结构,就像这里建议的其他答案一样
  • @AndreaCorbellini 我只是想知道在这种情况下这是否是我能做的最好的事情。
【解决方案2】:

您可以使用 Counter,它在 O(n) 时间内运行。

from collections import Counter

A = [1,2,3]
B = [3,1,2]

print(Counter(A) == Counter(B)) # Prints True

【讨论】:

  • 感谢您的解决方案。这些对象是不可散列的,所以我认为这行不通。
【解决方案3】:

我认为使用 set 是完成这项任务的一个很好的解决方案:

In [2]: A = [1,2,3]

In [3]: B = [3,1,2]
In [5]: set(A)==set(B)
Out[5]: True

此代码的复杂度为 O(n),更多信息您可以查看this link

如果您不想使用 set,可以尝试对列表进行排序:

def cmp(A,B):
  A1 = sorted(A)
  B1 = sorted(B)
  for item in A1:
    if binary_search(B1,item)==-1:
        return False
  for item in B1:
    if binary_search(A1,item)==-1:
        return False
  return True

【讨论】:

  • 感谢您的解决方案。但是,我不喜欢设置一个对象。我想对列表进行操作。
  • @KshitijSaraogi 你可以对两个列表进行排序,它将具有 O(N*logN) 复杂度。检查编辑的答案
  • 这些项目是不可散列的对象。此外,即使不是这样,我也不打算对列表进行排序。
  • @KshitijSaraogi 为什么你甚至需要散列来对对象进行排序?排序有什么问题?这不会影响原始列表。
  • 我知道。我只是不想这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多