【问题标题】:Return all pairs of integers from a given list of integers that have a difference of 2从给定的整数列表中返回差为 2 的所有整数对
【发布时间】:2020-04-06 14:53:01
【问题描述】:

正如标题所说,我需要找到列表中整数的差 2,并且必须返回一个带有元组的列表。

initial_list = [1, 2, 3, 4]
expected_output = [(1, 3), (2, 4)]

我写了这段代码:

arr = [1, 2, 3, 4]
n = 2
arr1 = []
for i in range(len(arr)):
    x = i + n
    if x in arr:
        arr1.append(x)
print(arr1)

但是没有用... 你能帮我吗? 谢谢

【问题讨论】:

  • [1,2,3,4,5,6] 的预期结果是什么
  • 最简单(虽然不一定是最有效)的方法是使用itertools.product 和列表推导。
  • i 不是列表的元素;它只是一个索引。请改用for i in arr:,或x = arr[i] + n
  • 如果有重复元素会怎样?

标签: python arrays algorithm


【解决方案1】:

如果将初始列表设为集合,则可以有效地测试 n+2 是否在每个 n 的集合中,如果是则包含元组:

initial_list = [1, 2, 3, 4]
s = set(initial_list)

[(n, n+2) for n in initial_list if n + 2 in s ]
# [(1, 3), (2, 4)]

【讨论】:

    【解决方案2】:

    您可以使用itertools.combinations 并仅获取相差 2 的组合:

    [(x, y) for x, y in combinations(lst, 2) if abs(x-y) == 2]
    

    代码

    from itertools import combinations
    
    lst = [1, 2, 3, 4]
    
    result = [(x, y) for x, y in combinations(lst, 2) if abs(x-y) == 2]
    # [(1, 3), (2, 4)]
    

    你为什么会得到你的输出?

    您正在迭代列表的索引,而不是元素本身。即使您遍历元素,您也会忽略一个元素,从而生成一个列表而不是一个元组列表作为输出。

    【讨论】:

      【解决方案3】:

      您的直接问题是 i 只是一个索引,而不是您的列表元素之一。要么

      for i in arr:
          ...
      

      for i in range(len(arr)):
          x = arr[i] + n
          ...
      

      将解决问题。

      但是,调用x in arr 需要 O(n) 时间,而且您实际上并不需要搜索整个列表,尤其是在您先对其进行排序的情况下。您只需要遍历列表,直到找到大于目标的值,例如

      for i, x in enumerate(sorted(arr)):
          for y in arr[i:]:
              d = y - x
              if d == 2:
                  arr1.append((x,y))
              elif d > 2:
                  break
      

      【讨论】:

        【解决方案4】:

        执行此操作的一种简单方法是使用如下所示的函数,该函数将整数列表和所需分隔符作为输入,并返回与分隔符匹配的值元组数组。

        arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        
        def findIntsWithDif(data, dif):
            res = []
            for val1 in data:
                for val2 in data:
                    if abs(val2 - val1) == dif and (val2, val1) not in res:
                        res.append((val1, val2))
        
            return res
        
        print(findIntsWithDif(arr, 2))
        

        这不是最有效的方法,但它确实给出了正确的输出。它适用于小型数组,但对于较大的数组,它会很慢,因为它的复杂度为 O(n^2)。

        【讨论】:

        • 这将是 O(N**2),并且对于大型数组来说会很慢。
        • 出于学习目的,这是一个很好的答案。显示解决问题的简单方法。但显然必须提防更大的输入。
        • 是的,有很多更有效的方法可以做到这一点,尽管作为一种基本算法,这很容易理解。
        猜你喜欢
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-07
        • 2011-11-05
        • 2016-03-07
        • 2022-12-12
        • 1970-01-01
        相关资源
        最近更新 更多