【问题标题】:How to check whether elements appears in the list only once in python?如何检查元素是否在python中只出现在列表中一次?
【发布时间】:2011-04-23 10:08:16
【问题描述】:

我有一个清单:

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

请解释一下如何检查元素是否在列表中只出现一次?

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

谢谢!

【问题讨论】:

  • 你的意思是什么那么不是1到4的所有元素都不在列表中1到4从何而来?
  • 对于您的第一个问题,您是否要检查 every 元素是否仅出现一次,或者 特定 元素是否仅在列表中出现一次?

标签: python list iteration


【解决方案1】:
len( set( a ) ) == len( a )

对于第一个问题,并且

( len( set( a ) ) == len( a ) == max( a ) ) and min( a ) == 1

第二次。

【讨论】:

  • 第二个答案要求a中的所有元素都是整数。
  • 如果它是用 pep8 风格写的,我会更喜欢它。就目前而言,代码看起来很糟糕。
  • @J.F. Sebastian:是的,但我只是从问题中假设 :) – @Blue Peppers:抱歉,我使用了太多不同的语言,无法为每种语言设置不同的编码风格;这就是我最喜欢它的方式。
【解决方案2】:

当我读到你的问题时,我从中得到了与马克不同的含义。如果你想检查一个特定元素是否只出现一次,那么

def occurs_once(a, item):
    return a.count(item) == 1

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

查看第二个问题的答案

【讨论】:

  • 你不是假设列表不包含双打吗?另外,你不应该只检查range(1,n+1) 中的每个元素是否都在a 中吗?
  • range 是较新 Python 中的生成器。
  • 哦,我明白了,我想我们对这个问题的理解不同。我认为1 - n 中的所有数字都应该包含在列表中,无论顺序和位置如何,也可能与其他数字混合。
  • @Herman,无论您如何阅读问题,它们都不可能与其他数字混合。 a = [1, 2, ..., len(a)] 必须包含 1 到 len(a) 之间的每个数字的一​​个副本,如果其中还有另一个数字,则它不满足要求。我的方法是错误的不检查最小值和最大值。例如[0, 1, 2, 7] 总和为 7,并且在没有检查的情况下通过了我的测试。
【解决方案3】:

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

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)
    

    【讨论】:

      【解决方案5】:

      我知道你想要这样的东西:

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

      【讨论】:

        猜你喜欢
        • 2017-09-24
        • 2018-04-24
        • 2012-04-03
        • 1970-01-01
        • 2017-03-14
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        相关资源
        最近更新 更多