[英]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.