给定一个整数列表,找出连续的对的个数



我正在尝试解决这个问题,给定一个整数列表,找到连续的对的数量。

例如,给定列表[1,2,5,8]:

可以由给定列表形成的对为(1,2),(1,5),(1,8),(2,5),(2,8),(5,8);唯一具有连续整数的对是(1,2),因此返回的值是1(1)。

我的代码如下,没有通过包含L1=[1,2,3,4,5,6,7,8,9]的测试单元格

有没有人知道如何修复这个代码,以便从任何列表中返回所有连续的数字对?

我收到了下面的错误:错误:AssertionError: Test Case L1失败(L1 = [1, 2, 3, 4, 5, 6, 7, 8, 9])

def count_pairs(L):
assert type(L)==list
res = [(a, b) for idx, a in enumerate(L) for b in L[idx + 1:]]
for i in range(0,len(res)):
if abs(res[i][0]-res[i][1]) ==1:
print((res[i][0],res[i][1]))
return len([(res[i][0],res[i][1])])

代码的问题在于count_pairs函数的最后一行,在这里您只返回包含单个连续对的列表,而不是所有连续对的计数。要解决这个问题,您可以删除对周围的方括号,只返回连续对列表的长度。

下面是更新后的代码:

def count_pairs(L):
assert type(L) == list
res = [(a, b) for idx, a in enumerate(L) for b in L[idx + 1:]]
consecutive_pairs = [(x, y) for (x, y) in res if abs(x - y) == 1]
for pair in consecutive_pairs:
print(pair)
return len(consecutive_pairs)

一种方法是使用itertools.combinations获得所有对,然后过滤它。更好的方法是先对列表进行.sort(),然后比较相邻的项:

from itertools import combinations
def count_pairs_one(lst):
return sum(1 for i, j in combinations(lst, r=2) if abs(i - j) == 1)
def count_pairs_two(lst: list):
lst.sort()
return sum(1 for i in range(len(lst) - 1) if (lst[i + 1] - lst[i]) == 1)
tests = [
[1, 2, 5, 8],
[3, 5, 6, 10],
[1, 7, 3, 6, 4],
]
for test in tests:
print(count_pairs_one(test), count_pairs_two(test))

注意:我假定清单中没有重复的项目。如果存在,第一种方法将返回不正确的结果,因为它计算了N次重复项。一个解决办法是把它们传递给一个集合,比如:set(combinations(lst, r=2)),或者如果它很大,你可以在外面有一个集合,在计算之前,检查它是否是一个新的对。

最新更新