1

私がリストを持っているとしましょう:

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

リストをループしています。前の文字が現在の文字と同じ場合、変数「count」は 1 ずつ増加します。以下はコードの一部のみです。

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

上記の例は、繰り返し a に対して 3, 1 を返し、bs に対して 2 を返します。カウントがそれぞれ1回だけ増加して合計2になるようにするには、何を使用できますか? 文字が以前に見られたかどうかに応じてTrueまたはFalseを返す変数「found」を使用してみましたが、これはもちろん[a、a、a、c、a、a、a]のようなものでは機能しません。私が望むように、これは「a」の最初の実行に対して2ではなく1を返します。

編集:私はおそらくこれを必要以上に難しくしています。私が望むのは、文字列が連続して繰り返され、カウントが 1 つインクリメントされるときだけです。[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

ワイルドな推測: a,a,b,b,b3 ではなく 2 になりたいので、またa,a,a,c,a,a,a2 を与えたいので、長さ >= 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

しかし、これは単なる推測です。少なくとも、「私が望むように、2ではなく、「a」の最初の実行で1を解釈している」と仮定すると、あなたが与えた2つのデータポイントと一致するものを私が考えることができる唯一のものです。これにより、合計を 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 に答える
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 に答える
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
  • まず、abは変数です....'a''b'は文字列です。
  • 次に、初期化previousしたことはありませんcount
  • 次に、比較=の代わりに(割り当て)を使用していました。==
  • count次に、 2つが等しくない場合、リセットしていませんでした。
  • 最後に、各反復に設定previousしていませんでした。item

このコードは3、最後に3つのbがあるため、を生成します。

于 2012-10-25T04:23:34.090 に答える
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

私があなたの質問を正しく理解していれば、リスト内で少なくとも 2 回連続して繰り返される文字の数だけを数えたいですか? 見つかった文字のリストを保存できます。このようなものは、必要なものを達成するはずです:

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 に答える