【问题标题】:Best way to compare every index of one list to every other index of that same list将一个列表的每个索引与同一列表的每个其他索引进行比较的最佳方法
【发布时间】:2021-02-18 18:36:42
【问题描述】:

这只是一个一般的算法问题,但我想知道是否有一种更有效/更快的方法可以将列表的每个元素与列表的每个其他元素进行比较而无需重复检查。

我有一个简单的实现

        for item in list:
            for comparator in list:
                if comparator == item:
                    pass
                else:
                    # do something...

但是这样做的问题是会有重复检查并且不能很好地扩展。有没有一种方法可以更有效或更快速地做到这一点?

【问题讨论】:

  • 查看itertools 模块。
  • 我已经有一段时间没有使用 Python 了,但是有没有一种 nlogn 方式,就像在其他语言中一样,这样第二个循环只会查看比当前循环更远的元素?

标签: python python-3.x algorithm performance


【解决方案1】:

为避免比较重复,请使用enumerate() 并跳过索引相同的情况。

for i, item in enumerate(list):
    for j, comparator in enumerate(list):
        if i == j:
            continue
        if comparator != item:
            # do something

没有办法避免缩放问题——您必须遍历每一对元素才能实现目标。这本质上是 O(n^2)。

【讨论】:

    【解决方案2】:

    我们可以做得比双循环更好,避免与相同的索引进行比较。我们还可以消除“镜像检查”(例如,如果我们检查 a==b,我们就不需要检查 b==a)。这就是来自itertoolscombinations 产生的结果。因此,每次我们在输入中添加另一个项目时,我们都会得到另外 n-1 个可能的比较。

    下面的示例生成长度为 2 的组合,并创建两个数字的元组和相等检查的结果。

    >>> from itertools import combinations
    >>> [(a, b, a == b) for a, b in combinations([1,2,3,1,2], 2)]
    [(1, 2, False), (1, 3, False), (1, 1, True), (1, 2, False), (2, 3, False), (2, 1, False), (2, 2, True), (3, 1, False), (3, 2, False), (1, 2, False)]
    

    【讨论】:

    • 这很好。谢谢!
    【解决方案3】:
    for i in list1:
        if i in list2:
            continue
        else:
            # do something
    

    不确定这是否是您需要的。

    【讨论】:

      【解决方案4】:

      使用多处理/线程的并行计算可能会使其更快。

      from multiprocessing.dummy import Pool as ThreadPool
          
      def action(enum_elem):
          index, item = enum_elem
          for index2, comparator in enumerate(list1):
              if index == index2:
                  continue
              if comparator != item:
                  # do something
                  
      pool = ThreadPool(5)
      pool.map(action, list(enumerate(list1))) 
      

      【讨论】:

      • 我不知道您是否知道原因,但我确信这种方法会使其变慢。除非你知道其他可能会影响它的东西?
      • 你是对的。多线程在这里可能不是一个好主意,因为在 python 中,多线程对于 CPU 密集型操作来说往往较慢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多