1

说我有清单:

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。

4

7 回答 7

1

I hope this works for you.

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
于 2012-10-25T05:28:20.220 回答
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。

于 2012-10-25T04:43:23.077 回答
1
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
于 2012-10-25T04:56:15.387 回答
0
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")
于 2012-10-25T05:59:53.590 回答
0

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

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 的方式来实现这一点。

于 2012-10-25T04:39:51.987 回答
0

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

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
  • 首先,aandb是变量.... 'a'and'b'是字符串。
  • 接下来,您从未初始化previouscount.
  • 接下来,您使用=的是(这是分配)而不是==用于比较。
  • 接下来,count如果两者不相等,您就不会重置。
  • 最后,您没有设置previous每次item迭代。

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

于 2012-10-25T04:23:34.090 回答
0

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

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

另请参阅https://docs.python.org/2/tutorial/datastructures.html#sets

于 2015-10-09T20:07:19.887 回答