【问题标题】:frozenset at least x elementsfreezeset 至少 x 个元素
【发布时间】:2016-07-10 13:26:58
【问题描述】:

我目前有这段代码,它检查数组中的所有元素是否相同。如果是这种情况,则返回 true

def all_equal(lst):
  """
  >>> all_equal([1,1,1,1,1,1,1])
  True
  >>> all_equal([1,2,3,1])
  False
  """
  return len(frozenset(lst)) == 1

但我要检查的是是否至少有 5 个相同的元素。

这样

[1,1,1,1,1,2,2]

也将返回 True。因为有 5 次 1

【问题讨论】:

    标签: python frozenset


    【解决方案1】:

    使用collections.Counter():

    from collections import Counter
    
    def all_equal(lst, count):
        return any(v >= count for v in Counter(lst).values())
    

    【讨论】:

      【解决方案2】:

      不要使用集合,而是使用bag or multiset type。多重集计算唯一值出现的次数。

      在 Python 中,collections.Counter() object

      from collections import Counter
      
      def all_equal(lst):
          bag = Counter(lst)
          if any(v >= 5 for v in bag.itervalues()):
              # an element occurred at least 5 times
              # (use bag.values() if using Python 3)
              return True
          return False
      

      【讨论】:

      • 但这会返回 True,即使它不是真的
      • @Sharpless512: 那么什么时候是真的?请具体。
      • @Sharpless512:您的问题暗示您希望在两个条件下返回 true:要么只有 1 个唯一元素,要么 元素至少出现 5 次。这是我编码的,如果有错误,你需要澄清你的问题。
      • 只有在相同元素至少出现 5 次时才返回 True
      • @Sharpless512:所以你想忽略“只有一个唯一值*的情况?然后简单地放弃第一个if测试。请在你的问题中说明这一点,它现在读起来就好像你想添加第二个测试到你现有的函数。
      【解决方案3】:

      使用Counter的简答:

      from collections import Counter
      
      def some_equal(lst):
          return max(Counter(lst).values()) >= 5
      

      Counter 是一个“集合”计数其元素的出现次数。 Counter.keys() 返回元素,Counter().values() 返回它们出现的次数。因此,这个max 确保有一个元素出现超过 5 次。

      【讨论】:

      • max() 将查看所有值,而您可以在第一个值 >= 5 处停止。
      • @eugeney 好吧,渐近复杂度是一样的 :)
      【解决方案4】:

      你也可以边走边检查,如果任何值为 5,则在迭代时短路:

      from collections import defaultdict
      
      def five(it):
          d  = defaultdict(int)
          for ele in it:
              d[ele] += 1
              if d[ele] == 5:
                  return True
          return False
      

      您可以使用计数器,但只计算 defaultdict 也一样快,有时实际上更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-09
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        相关资源
        最近更新 更多