如何在Python中检查列表中的元素是否仅出现一次?

8

我有一个列表:

a = [1, 2, 6, 4, 3, 5, 7]

请告诉我如何检查列表中元素是否仅出现一次?

同时,请解释一下是否所有从1到len(a)的元素都在列表中。例如,在列表'a'中,元素从1到7都在列表中,但是如果列表为b = [1, 4, 3, 5],则并非所有从1到4的元素都在列表中。

谢谢!


1
“then not all elements from 1 to 4 are not in the list” 是什么意思? “1到4”是从哪里来的? - Mark Byers
1
对于您的第一个问题,您想要检查每个元素是否仅出现一次,还是仅检查特定元素在列表中是否仅出现一次? - Mark Byers
5个回答

8
当我读到你的问题时,我的理解与Mark不同。如果你想检查特定元素是否只出现一次,则可以:
def occurs_once(a, item):
    return a.count(item) == 1

只有当item在列表中恰好出现一次时,才会为真。

第二个问题请参见Pokes的答案。


你难道不是假设列表中没有重复项吗?此外,你只需要检查 range(1,n+1) 中的每个元素是否在 a 中。 - Herman Schaaf
range 是新版本 Python 中的生成器。 - poke
哦,我明白了,我觉得我们对问题的理解不同。我认为列表中应该包含从1到n的所有数字,无论顺序和位置如何,并且可能与其他数字混合在一起。 - Herman Schaaf
@Herman,无论你如何阅读问题,它们都不可能与其他数字混合。如果a = [1, 2, ..., len(a)]中有另一个数字,则必须包含1到len(a)之间每个数字的一个副本,否则它就不符合要求。我的方法是错误的,因为没有检查最小值和最大值。例如,[0, 1, 2, 7]总和为7,并且在没有检查的情况下击败了我的测试。 - aaronasterling

7
len( set( a ) ) == len( a )

针对第一个问题,
( len( set( a ) ) == len( a ) == max( a ) ) and min( a ) == 1

对于第二个问题。


第二个答案要求a中的所有元素都是整数。 - jfs
1
如果这段代码按照 pep8 规范编写,我会喜欢得多。现在看起来很糟糕。 - Blue Peppers
@J.F. Sebastian:是的,但我只是从问题中假设了这一点 :) - @Blue Peppers:抱歉,但我使用太多不同的语言,无法为每种语言都有不同的编码风格;而且这就是我最喜欢的方式。 - poke

5

对于您的第一个问题,如果您的元素是可哈希的,您可以创建一个包含这些元素的集合并检查其长度:

len(set(a)) == len(a)

如果结果为False,您可以使用此函数,它可以比上面的函数提供更好的性能(但当结果为True时性能较差):

def are_all_elements_unique(l):
    seen = set()
    for x in l:
        if x in seen:
            return False
        seen.add(x)
    return True

4

对于第二个问题,您可能需要检查一下

sorted(a) == range(1, len(a) + 1)

3
我明白您需要类似以下内容的翻译:

我理解您希望得到类似以下内容的帮助:

[x for x in a if a.count(x) == 1]

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