Python 检查列表中的整数是否不重复,并按顺序排列

Python 检查列表中的整数是否不重复,并按顺序排列,python,Python,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):

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, buff=过滤器(λx:x>0,testGroupList) 最大值=最大值(buff) 对于范围内的i(最大值): id=i+1 val=buff.count(id) 如果val==1:打印id, elif val>=2:打印“(测试组%d重复%d次)”%(id,val), elif val==0:打印“(缺少测试组%d)”%id,
对于Python2.7或3.1,您可以使用计数器,但对于Python3,需要更改打印

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(),
对于枚举中的i,v(buff): 如果我v-1: 打印“缺失或重复”
如果您不需要花哨的错误报告,那么您可以将其实现为两个简单的检查:

positiveValues = [x for x in testGroupList if x > 0]
if len(positiveValues) != len(set(positiveValues)):
    print("Input has duplicate values")
elif len(positiveValues) != max(positiveValues):
    print("Input has missing values")

如果您希望在较小的代码中更优雅,那么您可以这样做:

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中的标准函数。

如果您只是试图确定列表没有重复项,那么可以使用列表的元素创建一个set(),并比较两者的长度。相同的长度意味着没有重复

确定它们是否是连续的可以查看列表的最大值和最小值的差异,这应该比长度小一

“设置差异”可用于查找缺少的整数

以下是一些简明的定义:

def all_different(any_list):
    '''returns True if all items in the list are different.
    (Note: this assumes input is a list'''
    return len(any_list) == len(set(any_list))

def any_duplicate(any_list):
    '''returns True if any items in the list are repeated.
    (Note: this assumes input is a list'''
    return len(any_list) != len(set(any_list))

def sequential_ints(list_of_ints):
    '''returns True if input is a sequential list of ints.
    (Note: this assumes input is a list, and only of ints'''
    return len(list_of_ints)-1==max(list_of_ints)-min(list_of_ints)

def find_missing(list_of_ints):
    '''returns a list of any integers "missing", assuming 
    input was "supposed to be" sequential list of ints.
    (Note: this assumes input is a list, and only of ints'''
    return list( set(range(min(list_of_ints),max(list_of_ints)+1))-set(list_of_ints) )
此测试代码:

list1 = [1, 2, 3, 4, 5, 6]
print("all_different:", all_different(list1))
print("any_duplicate:", any_duplicate(list1))
print("sequential_ints:", sequential_ints(list1))
print("find_missing:   ", find_missing(list1))
print()

list2 = [1, 2, 3, 4, 5, 6, 2]
print("all_different:", all_different(list2))
print("any_duplicate:", any_duplicate(list2))
print("sequential_ints:", sequential_ints(list2))
print("find_missing:   ", find_missing(list2))
print()

list3 = [1, 3, 4, 6]
print("all_different:", all_different(list3))
print("any_duplicate:", any_duplicate(list3))
print("sequential_ints:", sequential_ints(list3))
print("find_missing:   ", find_missing(list3))
给出:

all_different: True
any_duplicate: False
sequential_ints: True
find_missing:    []

all_different: False
any_duplicate: True
sequential_ints: False
find_missing:    []

all_different: True
any_duplicate: False
sequential_ints: False
find_missing:    [2, 5]

编辑为使用buff而不是testgrouplist与OP的原始代码不同,这不会过滤掉非正字符,并关心元素的顺序。编辑后,使用示例中的buff而不是testgrouplist会过滤掉非正字符对不起,问题不清楚。你的意思是你需要检查一下:对于列表中所有大于零的数字,这些数字是按顺序排列的,并且按顺序向上计数?所以[3,4,-2,0,5]通过了,但是[3,4,4,5],[3,5]和[3,5,4]没有通过?
all_different: True
any_duplicate: False
sequential_ints: True
find_missing:    []

all_different: False
any_duplicate: True
sequential_ints: False
find_missing:    []

all_different: True
any_duplicate: False
sequential_ints: False
find_missing:    [2, 5]