检查列表中的整数是否不重复且连续

1 投票
5 回答
1466 浏览
提问于 2025-04-15 20:19

testGroupList 是一个整数列表。
我需要检查 testGroupList 中的数字是否是连续的,并且没有重复的数字。负数可以忽略。

举个例子,像 [1,2,-1,2,3,4] 就是错误的,因为数字 2 重复了,但 [-1,3,2,4,1,5] 就是正确的。

我按照下面的方式实现了这个功能,但感觉写得很丑。有没有更聪明的方法可以做到这一点?

    buff = filter(lambda x: x > 0, testGroupList) 
    maxval = max(buff) 
    for i in range(maxval): 
        id = i+1 
        val = buff.count(id) 
        if val == 1: print id, 
        elif val >= 2: print "(Test Group %d duplicated %d times)" % (id, val), 
        elif val == 0: print "(Test Group %d missing)" % id,

5 个回答

0

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这时候,我们可以去一些技术论坛,比如StackOverflow,去寻找解决方案或者向其他人请教。在这些论坛上,很多人会分享他们的经验和解决办法,帮助我们更好地理解问题。

当你在这些论坛上提问时,记得把你的问题描述清楚,包括你遇到的错误信息和你尝试过的解决方法。这样其他人才能更好地帮助你。

总之,利用好这些技术社区,可以让我们在学习编程的过程中少走很多弯路。

for i, v in enumerate(buff):
    if i != v - 1:
        print "MISSING OR DUPLICATE"
1

如果你想要更简洁的代码,也就是代码行数更少的话,你可以这样写:

buff = [x for x in testGroupList if x > 0]
for i, val in enumerate([buff.count(x) for x in xrange(1,max(buff))]):
    if val == 1: print i+1, 
    elif val > 1: print "(Test Group %d duplicated %d times)" % (i+1, val), 
    elif val == 0: print "(Test Group %d missing)" % (i+1),

这个写法和你最开始的代码差不多。我用的是 i 而不是 id,因为 id 在 Python 里是一个标准的函数。

1

对于Python 2.7或3.1版本,你可以使用Counter这个工具,不过在Python 3中打印的方式需要稍微调整一下。

from collections import Counter
counter = Counter(x for x in testGroupList if x>=0)
minval = min(Counter) 
maxval = max(Counter)
messages={0:"(Test Group %(id)d missing)",
          1:"%(id)d",
          2:"(Test Group %(id)d duplicated %(val)d times)"}
for id in range(minval,maxval+1): 
    val = counter[id]
    print(messages[min(val,2)]%vars())

如果你用的是更老的Python版本,可以使用defaultdict这个工具。

from collections import defaultdict
counter = defaultdict(int)
for k in testGroupList:
    if k>=0:counter[k]+=1

minval = min(counter) 
maxval = max(counter)
messages={0:"(Test Group %(id)d missing)",
          1:"%(id)d",
          2:"(Test Group %(id)d duplicated %(val)d times)"}
for id in range(minval,maxval+1): 
    val = counter[id]
    print messages[min(val,2)]%vars(),

撰写回答