【问题标题】:In Python, how can I increment a count conditionallly?在 Python 中,如何有条件地增加计数?
【发布时间】:2012-10-25 04:19:49
【问题描述】:

假设我有清单:

list = [a,a,b,b,b]

我正在遍历列表。当前一个字母与当前字母相同时,变量“count”加 1。以下只是部分代码:

for item in list:
    if item == previous:
        count +=1
return count

上面的例子返回 3,1 代表重复 a,2 代表 bs。我可以用什么让它计数只增加一次,总共 2?我尝试使用一个变量“found”,它根据之前是否见过字母返回 True 或 False,但这当然不适用于 [a,a,a,c,a,a,a] 之类的东西,如我所愿,它为“a”的第一次运行返回 1 而不是 2。

编辑:我可能比它需要的更难。我想要的只是在任何时候连续重复一个字符串以使计数增加一。 [a,b,b,c,a,a,a,a,c,c,c,] 应该返回 3。 [a,a,a,a,a,a,a,a] 应该返回 1。

【问题讨论】:

  • = 在 python 中从来不是一个相等运算符;它始终是一个绑定(又名赋值)运算符。如果代码是 item == previous ,结果会有所不同 .. 此外,您需要将某些内容绑定到 previous 以使其有意义。
  • 不要用变量覆盖列表内置名称
  • 你能澄清一下这个问题吗?如果您想计算与前一个字符相同的字符数,那么您确实需要“aabbb”的答案 3。但后来你说你想要“aaacaaa”的答案 2,我认为应该是 4。你到底想要什么?

标签: python increment


【解决方案1】:

猜测:由于您希望 a,a,b,b,b 为 2 而不是 3,并且您还希望 a,a,a,c,a,a,a 给出两个,我认为您正在尝试计算长度 >= 2 的相等元素的不同连续组。如果是这样,您可以使用itertools.groupby

>>> import itertools
>>> seq1 = ['a','a','b','b','b']
>>> [(k, list(g)) for k,g in itertools.groupby(seq1)]
[('a', ['a', 'a']), ('b', ['b', 'b', 'b'])]
>>> seq2 = ['a','a','a','c','a','a','a']
>>> [(k, list(g)) for k,g in itertools.groupby(seq2)]
[('a', ['a', 'a', 'a']), ('c', ['c']), ('a', ['a', 'a', 'a'])]

因此

>>> sum(len(list(g)) >= 2 for k,g in itertools.groupby(seq1))
2
>>> sum(len(list(g)) >= 2 for k,g in itertools.groupby(seq2))
2

但这只是猜测。这是我能想到的唯一与您给出的仅有的两个数据点相匹配的东西,至少假设我正确地解释了“第一次运行“a”而不是 2,因为我想要解释“1”。这使得您不清楚您是希望总数为 2 还是第一次运行“a”的贡献为 2。

【讨论】:

  • 你可以使用sum(1 for i in g)作为len(list(g))的内存高效版本
【解决方案2】:
def max_contiguous_repeat(data):
   max_repeats = 0
   if data:
      previous = data[0]
      count = 0
      for item in data[1:]:
         if item == previous:
            count += 1
            continue
         max_repeats = max(count, max_repeats)
         previous = item
         count = 0
      max_repeats = max(count, max_repeats)
   return max_repeats

【讨论】:

    【解决方案3】:

    我希望这对你有用。

    a = ['a', 'b', 'b', 'c', 'a', 'a', 'a', 'a', 'c', 'c', 'c']
    previo = None
    counter = 0
    temp_l, checked = [], []
    for item in a:
        if item != previo:
            temp_l = []
    
        if not temp_l or item == previo:
            temp_l.append(item)
            previo = item
    
        if len(temp_l) >= 2 and item not in checked:
            counter += 1
            checked.append(item)
    
        previo = item
    
    print counter
    

    【讨论】:

      【解决方案4】:

      我不确定你想要这个产生什么,但无论哪种方式,你的代码都丢失了很多。

      my_list = ['a', 'a', 'b', 'b', 'b']
      previous = None
      count = 1
      for item in my_list:
          if item == previous:
              count += 1
          else:
              count = 1
          previous = item
      print count
      
      • 首先,ab 是变量......'a''b' 是字符串。
      • 接下来,您从未初始化过previouscount
      • 接下来,您使用=(即赋值)而不是== 进行比较。
      • 接下来,如果两者不相等,您不会重置 count
      • 最后,您没有在每次迭代时都将 previous 设置为 item

      这段代码产生3,因为末尾有3个b。

      【讨论】:

      • 此代码仍会在每次 item = previous 时递增。另外,我不需要 count 重新初始化为零。
      • 那么,我真的不知道你想要完成什么
      • 正如我所说,这只是我的代码的一部分。我敢肯定,如果我没有 a 和 b 作为字符串并初始化 previous 和 count,它就行不通。我确切地知道为什么我得到 3,这不是我想要做的。对于列表,例如,["a","c",b","b","a","a","a"],我试图得到 2——一个代表 b 和一个对于 a。我不希望每个 a 或每个 b 都增加一次,整个运行只增加一次。谢谢您的回复。
      【解决方案5】:

      如果我正确理解了您的问题,您只想计算列表中连续至少重复两次的字母数吗?您可以存储找到的字母列表。像这样的东西应该可以满足您的需求:

      l = ['a', 'a', 'b', 'b', 'b']
      repeated = []
      previous = None
      count = 0
      for item in l:
          if item == previous and item not in repeated:
              count += 1
              repeated.append(item)
          else:
              repeated = []
          previous = item
      return count
      

      请注意,DSM 发布了一种更类似于 python 的方式来完成此操作。

      【讨论】:

        【解决方案6】:
        import collections
        defaultdict=collections.defaultdict
        def get_count(string):
            d=defaultdict(int)
            for k in string:
                d[k]+=1
            return max(d.items(),key=lambda a:a[1])
        

        这样的东西可以工作,你可以像这样使用它:

        common_character,occurances=get_count("aaaaabbbbbcccdddd")
        

        【讨论】:

          【解决方案7】:

          我不确定我是否清楚地理解了这个问题,而且它现在已经很老了,但它的价值是你想要的(唯一值的数量)?

          >>> some_list = ['a', 'a', 'b', 'b', 'b']
          >>> len(set(some_list))
          2
          

          另见https://docs.python.org/2/tutorial/datastructures.html#sets

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-06
            • 2020-09-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多