簡體   English   中英

如何在python中計算字符串中的重復字符

[英]how to count repeated characters in a string in python

編寫一個python函數,該函數對給定的String執行游程長度編碼,並返回經過游程長度編碼的String。

我嘗試使用循環,但無法獲得預期的輸出。

def encode(message):    
    #Remove pass and write your logic here
    count=0
    encoded_message=[]
    for char in range(0,len(message)-1,1):
        count=1
        while(message[char]==message[char+1]):

             count=count+1;
             char=char+1
        encoded_message.append(str(count)+message[char])

    return encoded_message

encoded_message=encode("ABBBBCCCCCCCCAB")
print(' '.join(encoded_message))

預期輸出為1A4B8C1A1B 我得到的是1A 4B 3B 2B 1B 8C 7C 6C 5C 4C 3C 2C 1C 1A

您可以從itertools模塊使用groupby

s = "ABBBBCCCCCCCCAB"
from itertools import groupby
expected = ''.join([str(len(list(v)))+k for k,v in groupby(s)])

輸出

'1A4B8C1A1B'

groupby(s)返回itertools.groupby對象。 關於此對象的列表理解,例如[(k,list(v)) for k,v in groupby(s)]我們返回此命令:

[('A', ['A']), ('B', ['B', 'B', 'B', 'B']), ('C', ['C', 'C', 'C', 'C', 'C', 'C', 'C', 'C']), ('A', ['A']), ('B', ['B'])]

我們可以只計算第二個元組中子項目的數量,然后在第一個元組之前添加其字符串格式,然后將所有這些子元合並。

更新 :您正在嘗試通過執行char=char+1來更改循環中的迭代索引,但它不會更改迭代索引,即,在接下來的2或3或4個迭代中循環不會通過。 在代碼中添加這兩條打印行,您會發現要在循環時嘗試增加的char變量不僅僅是迭代索引:

...
for char in range(0,len(message)-1,1):
        print('\tchar at first line : ', char, 'char id now : ', id(char))
        count=1
        while(message[char]==message[char+1]):
            count=count+1
            char=char+1
            print('char now : ', char, 'char id now : ', id(char))
            ...

它應該輸出類似:

    char at first line :  1 char id now :  11197408
char now :  2 char id now :  11197440
char now :  3 char id now :  11197472
char now :  4 char id now :  11197504

看,每次charid如何更改。

您還可以使用re模塊對字符串進行編碼:

s = 'ABBBBCCCCCCCCAB'

import re

l = ''.join(str(len(c2)+1) + c1 for c1, c2 in re.findall(r'([A-Z])(\1*)', s))

print(l)

印刷品:

1A4B8C1A1B
def func(string):
    string +='@'
    dic = []
    tmp =[]
    tmp += [string[0]]

    for i in range(1,len(string)):

        if string[i]==string[i-1]:
            tmp.append(string[i])
        else:
            dic.append(tmp)
            tmp=[]
            tmp.append(string[i])
    res = ''.join(['{}{}'.format(len(i),i[0]) for i in dic])
    return res

string = 'ABBBBCCCCCCCCAB'         
solution = func(string)

print(solution)

輸出

1A4B8C1A1B

使用此邏輯,它將為您返回每個字母出現頻率的字典。

s = "ABBBBCCCCCCCCAB"
d = {i:0 for i in s}
for i in s:
    d[i] += 1
print(d)

**output:-**
{'A': 2, 'B': 5, 'C': 8}

如果要修復功能,則為固定的變體:

def encode(message):
    result = []
    i = count = 0
    while i < len(message) - 1:
        count = 1
        while i + count < len(message) and message[i + count - 1] == message[i + count]:
            count += 1
        i += count
        result.append("{}{}".format(count, message[i - 1]))
    if count == 1:
        result.append("1" + message[-1])
    return result

更改內容:

  1. for循環替換為while 為什么? 因為您需要跳過索引incide循環。 range(0,len(message)-1,1)返回列表[0, 1, 2, ...]而與char變量incide循環無關緊要,不會影響下一次迭代。 為了有可能跳過一些我在while循環中使用的具有預定義( i = count = 0 )索引和計數變量的索引。
  2. 內部while循環的條件已更改。 現在有兩個條件:
    • message[i + count - 1] == message[i + count] -檢查下一個符號是否與當前符號相同;
    • i + count < len(message) -防止內部循環訪問索引超出范圍。
  3. 在內部循環之外更新“主”索引( i )。
  4. if count == 1:在循環執行后添加了后置條件,以防丟失最后一個字符(如果是單個字符)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM