如何判断列表中是否包含连续的数字

23

我想测试一个列表是否包含连续的整数且没有重复的数字。 例如,如果我有:

l = [1, 3, 5, 2, 4, 6]

它应该返回True。

如何检查列表是否包含最多n个连续数字,而不修改原始列表? 我考虑了复制列表,并删除出现在原始列表中的每个数字,如果列表为空,则返回True。

有更好的方法吗?


你的例子中答案应该是什么? - saulspatz
我很困惑为什么你的测试用例应该返回“True”,因为5和2不是连续的。 - wnnmaw
这些条目是整数吗?它们是非负数或严格正数吗? - Blender
在R中,它将是any(diff(sort(x)) == 1) & all(table(x) == 1),但我还不会Python,所以我很想看看它是如何完成的。我正在尽可能地翻译,以便学习两种语言。 - Pierre L
如果数字是连续的,就不能重复。因此第二个条件是多余的。当检查 [1,2,2,3] 时,期望的输出是什么?如果答案是 True,请重新措辞问题。 - Pynchia
“如何检查列表是否包含最多n个连续数字”是什么意思?这似乎是一个单独的问题,与“我想测试列表是否包含连续整数且没有重复项”不同。如果n==2,那么[1, 1, 3, 4][1, 3, 4]的答案应该是什么? - ruancomelli
13个回答

0

排序

在Python 3中,我使用这个简单的解决方案:

def check(lst):
    lst = sorted(lst)
    if lst:
        return lst == list(range(lst[0], lst[-1] + 1))
    else:
        return True

请注意,在对列表进行排序后,其最小值和最大值可以免费获得,分别为第一个(lst[0])和最后一个(lst[-1])元素。
如果参数为空,我返回True,但这决定是任意的。请选择最适合您用例的方法。
在此解决方案中,我们首先对参数进行排序,然后将其与另一个已知连续且没有重复的列表进行比较。

不排序

在其中一个答案中,OP发表评论询问是否可能在不对列表进行排序的情况下执行相同操作。这很有趣,这是我的解决方案:
def check(lst):
    if lst:
        r = range(min(lst), max(lst) + 1) # *r* is our reference
        return (
            len(lst) == len(r)
            and all(map(lst.__contains__, r))
            # alternative: all(x in lst for x in r)
            # test if every element of the reference *r* is in *lst*
        )
    else:
        return True

在这个解决方案中,我们构建了一个参考范围r,它是一系列连续(因此不重复)的int序列。有了这个,我们的测试就很简单:首先,我们通过将其与参考进行比较来检查lst是否具有正确数量的元素(不多也不少,这表明重复或间隙)。然后,我们检查我们的参考中的每个元素是否也在lst中(这就是all(map(lst.__contains__, r))所做的:它遍历r并测试它的所有元素是否都在lts中)。

0

1.

l.sort()

2.

for i in range(0,len(l)-1)))
   print(all((l[i+1]-l[i]==1)

1
请在添加答案时更清晰,并使用格式化程序快捷方式。例如:使用反引号 ` 来格式化代码。 - Malkhazi Dartsmelidze

-1

这是一个非常简短易懂的解决方案,无需使用任何导入:

range = range(10)
L = [1,3,5,2,4,6]
L = sorted(L, key = lambda L:L)
range[(L[0]):(len(L)+L[0])] == L

>>True

这适用于任何长度的数字列表并检测重复项。 基本上,您正在创建一个范围,该范围可能与您的列表匹配,编辑该范围以符合您的列表条件(长度,起始值)并进行快照比较。我为我编写的一款纸牌游戏想出了这个方法,在其中需要检测手中的顺子/奔跑,并且似乎效果不错。


2
不建议将range用作变量,因为它有自己的函数。此外,在复制您的解决方案时,会生成以下错误:TypeError:'range'对象不可调用。 - Bondeaux
key = lambda L:L 是没有意义的。恒等函数是默认的排序键函数。使用 lambda 实现恒等函数只会减慢速度。此外,sorted 函数创建一个列表,并通过调用列表的 .sort 方法来对其进行排序。因此,您应该直接调用 L.sort() 而不是浪费时间和 RAM 创建新列表。 - PM 2Ring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接