繁体   English   中英

从给定的整数列表中返回差为 2 的所有整数对

[英]Return all pairs of integers from a given list of integers that have a difference of 2

就像标题说的那样,我需要找到一个列表中整数的差 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)

但不起作用...你能帮帮我吗? 谢谢

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

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)]

您可以执行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)]

为什么你会得到你的 output?

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

您的直接问题是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

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

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))

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM