在Python中,如何有条件地增加计数?

2024-04-27 18:26:37 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有清单:

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

我在名单上打转。当前一个字母与当前字母相同时,变量“count”增加1。以下只是代码的一部分:

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

上面的示例返回3,1表示repeat a,2表示bs。我能用什么使它只增加一次,每次共2?我试着使用一个变量“found”,它返回True或False,这取决于以前是否看到过字母,但这当然不适用于像[a,a,a,c,a,a,a,a]这样的情况,它返回1表示“a”s的第一次运行,而不是2,这是我想要的。

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


Tags: 代码in示例forreturnifbscount
3条回答

胡乱猜测:由于您希望a,a,b,b,b是2而不是3,并且您还希望a,a,a,c,a,a,a给出2,我认为您正在尝试计算长度等于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”的第一次运行是“1”,而不是“2”。这就不清楚你是希望总数为2,还是希望第一轮“a”的贡献为2。

更新

我希望这对你有用。

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

再见

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

相关问题 更多 >