我想测试一个列表是否包含连续的整数且没有重复的数字。 例如,如果我有:
l = [1, 3, 5, 2, 4, 6]
它应该返回True。
如何检查列表是否包含最多n个连续数字,而不修改原始列表? 我考虑了复制列表,并删除出现在原始列表中的每个数字,如果列表为空,则返回True。
有更好的方法吗?
在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
,但这决定是任意的。请选择最适合您用例的方法。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
中)。1.
l.sort()
2.
for i in range(0,len(l)-1)))
print(all((l[i+1]-l[i]==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
这适用于任何长度的数字列表并检测重复项。 基本上,您正在创建一个范围,该范围可能与您的列表匹配,编辑该范围以符合您的列表条件(长度,起始值)并进行快照比较。我为我编写的一款纸牌游戏想出了这个方法,在其中需要检测手中的顺子/奔跑,并且似乎效果不错。
key = lambda L:L
是没有意义的。恒等函数是默认的排序键函数。使用 lambda 实现恒等函数只会减慢速度。此外,sorted
函数创建一个列表,并通过调用列表的 .sort
方法来对其进行排序。因此,您应该直接调用 L.sort()
而不是浪费时间和 RAM 创建新列表。 - PM 2Ring
any(diff(sort(x)) == 1) & all(table(x) == 1)
,但我还不会Python,所以我很想看看它是如何完成的。我正在尽可能地翻译,以便学习两种语言。 - Pierre L[1,2,2,3]
时,期望的输出是什么?如果答案是True
,请重新措辞问题。 - Pynchian==2
,那么[1, 1, 3, 4]
和[1, 3, 4]
的答案应该是什么? - ruancomelli