检查列表中的整数是否不重复且连续
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(),