簡體   English   中英

Python - 刪除字符串中的重復字母

[英]Python - removing repeated letters in a string

假設我有一個按字母順序排列的字符串,基於字母重復的次數。

  • 示例:“BBBAADDC”。

有3個B,所以開頭是go,2個A,2個D,所以A的go在D的前面,因為它們是按字母順序排列的,還有1個Z0D2161F83740143E。 另一個例子是 CCCCAAABBDDAB。

請注意,中間某處(即 CCCC)可能有 4 個字母,因為可能有 2 對 2 個字母。

但是,假設我只能連續輸入 n 個字母。 例如,如果在第二個示例中 n = 3,那么我將不得不從 4 個 C 的第一個 substring 中省略一個“C”,因為一行中最多只能有 3 個相同的字母。

另一個例子是字符串“CCDDDAABC”; 如果 n = 2,我將不得不刪除一個 C 和一個 D 以獲得字符串CCDDAABC

示例輸入/輸出:

  1. n=2:輸入:AAABBCCCCDE,Output:AABBCCDE
  2. n=4:輸入:EEEEEFFFFGGG,Output:EEEEEFFFFGGG
  3. n=1:輸入:XXYYZZ,Output:XYZ

如何使用 Python 做到這一點? 提前致謝!

這就是我現在所擁有的,盡管我不確定它是否在正確的軌道上。 這里,z 是字符串的長度。

for k in range(z+1):
        if final_string[k] == final_string[k+1] == final_string[k+2] == final_string[k+3]: 
            final_string = final_string.translate({ord(final_string[k]): None})
return final_string

這是我的解決方案:

def snip_string(string, n):
    list_string = list(string)
    list_string.sort()
    chars = set(string)
    for char in chars:
        while list_string.count(char) > n:
            list_string.remove(char)
    return ''.join(list_string)

使用不同的n值調用 function 會得到以下 output:

>>> string = "AAAABBBCCCDDD"
>>> snip_string(string, 1)
'ABCD'
>>> snip_string(string, 2)
'AABBCCDD'
>>> snip_string(string, 3)
'AAABBBCCCDDD'
>>> 

編輯

這是我的解決方案的更新版本,僅當重復字符超過n時才會刪除字符。

import itertools

def snip_string(string, n):
    groups = [list(g) for k, g in itertools.groupby(string)]
    string_list = []
    for group in groups:
        while len(group) > n:
            del group[-1]
        string_list.extend(group)
    return ''.join(string_list)

Output:

>>> string = "DDDAABBBBCCABCDE"
>>> snip_string(string, 3)
'DDDAABBBCCABCDE'
hello = "hello frrriend"


def replacing() -> str:
    global hello
    j = 0
    for i in hello:
        if j == 0:
            pass
        else:
            if i == prev:
                hello = hello.replace(i, "")
                prev = i
        prev = i
        j += 1
    return hello

replacing()

看起來有點原始,但我認為它有效,這就是我在 go 上想出的,希望它有所幫助:D

好的,根據您的評論,您要么對字符串進行預排序,要么不需要按您嘗試創建的 function 對其進行排序。 您可以使用itertools.groupby()更輕松地做到這一點:

import itertools

def max_seq(text, n=1):
    result = []
    for k, g in itertools.groupby(text):
        result.extend(list(g)[:n])
    return ''.join(result)


max_seq('AAABBCCCCDE', 2)
# 'AABBCCDE'
max_seq('EEEEEFFFFGGG', 4)
# 'EEEEFFFFGGG'
max_seq('XXYYZZ')
# 'XYZ'
max_seq('CCCDDDAABC', 2)
# 'CCDDAABC'

在每個組g中,它被擴展然后切片直到n元素( [:n]部分),因此您最多可以連續獲得每個字母n次。 如果相同的字母出現在其他地方,則在連續計數n時將其視為獨立序列。


編輯:這是一個較短的版本,對於很長的字符串也可能表現更好。 當我們使用itertools時,這個還使用了itertools.chain.from_iterable()來創建扁平化的字母列表。 由於這些都是生成器,因此僅在最后一行進行評估/擴展:

import itertools

def max_seq(text, n=1):
    sequences = (list(g)[:n] for _, g in itertools.groupby(text))
    letters = itertools.chain.from_iterable(sequences)
    return ''.join(letters)
from itertools import groupby
n = 2
def rem(string):
    out = "".join(["".join(list(g)[:n]) for _, g in groupby(string)])
    print(out)

所以這是您問題的全部代碼。

s = "AABBCCDDEEE"
s2 = "AAAABBBDDDDDDD"
s3 = "CCCCAAABBDDABBB"
s4 = "AAAAAAAA"
z = "AAABBCCCCDE"

通過以下測試:

AABBCCDDEE
AABBDD
CCAABBDDABB
AA
AABBCCDE

暫無
暫無

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

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