подсчет количества символов в строке

#python

#python

Вопрос:

Я хочу узнать, как часто «северный олень» (в любом порядке) появляется в случайной строке и какая строка остается после удаления «северного оленя». Мне нужно сохранить порядок оставшейся строки

Так, например

"erindAeer" -> A (олень приходит 1 раз)

 "ierndeBeCrerindAeer" -> ( 2 reindeers, left over is BCA)
  

Я думал о сортировке и удалении «оленей», но мне нужно сохранить порядок. Какой хороший способ сделать это?

Комментарии:

1. Вы хотите проверить, есть ли перестановки строки в целевой строке?

2. Вы имеете в виду, что хотите заменить буквы r, e, i, n, d, e, e, r, s равное количество раз. После замены остатки будут иметь тот же порядок.

Ответ №1:

Мы можем заменить эти буквы, узнав, сколько раз они повторяются, и Counter это удобно для подсчета элементов.

 from collections import Counter

def leftover(letter_set, string):
    lcount, scount = Counter(letter_set), Counter(string)
    repeat = min(scount[l] // lcount[l] for l in lcount)
    for l in lcount:
        string = string.replace(l, "", lcount[l] * repeat)
    return f"{repeat} {letter_set}, left over is {string}"

print(leftover("reindeer", "ierndeBeCrerindAeer"))
print(leftover("reindeer", "ierndeBeCrerindAeere"))
print(leftover("reindeer", "ierndeBeCrerindAee"))
  

Вывод:

 2 reindeer, left over is BCA
2 reindeer, left over is BCAe
1 reindeer, left over is BCerindAee
  

Ответ №2:

Вот довольно простой подход, использующий collections.Counter :

 from collections import Counter

def purge(pattern, string):
    scount, pcount = Counter(string), Counter(pattern)
    cnt = min(scount[x] // pcount[x] for x in pcount)
    scount.subtract(pattern * cnt)
    return cnt, "".join(scount.subtract(c) or c for c in string if scount[c])

>>> purge("reindeer", "ierndeBeCrerindAeer")
(2, 'BCA')
  

Ответ №3:

Вот код на Python:

 def find_reindeers(s):
    rmap = {}
    for x in "reindeer":
        if x not in rmap:
            rmap[x] = 0
        rmap[x]  = 1

    hmap = {key: 0 for key in "reindeer"}
    for x in s:
        if x in "reindeer":
            hmap[x]  = 1

    total_occ = min([hmap[x]//rmap[x] for x in "reindeer"])

    left_over = ""
    print(hmap, rmap)
    for x in s:
        if (x in "reindeer" and hmap[x] > total_occ * rmap[x]) or (x not in "reindeer"):
            left_over  = x

    return total_occ, left_over

print(find_reindeers("ierndeBeCrerindAeer"))
  

Вывод для ierndeBeCrerindAeer :

 (2, "BCA")
  

Комментарии:

1. Существует проблема, связанная с if (x in "reindeer" and hmap[x] > total_occ * rmap[x]) тем, что если буква в строке отображается больше, чем кратное «олень», вся эта буква будет распечатана. Используйте "ierndeBeCrerindAeere" (еще одну букву «е» в конце) в качестве примера, результат будет (2, 'eeBeCeAeee') .

Ответ №4:

Вы можете сделать это с помощью функции count и replace string:

 import queue
word = "reindeer" 
given_string = "ierndeBeCrerindAeer"
new_string = ""
counter = 0
tmp = ""
letters = queue.Queue()



for i in given_string:
    if not i in word:
        new_string  = i
    else:
        letters.put(i)


x = 0
while x < len(word):
    while not letters.empty():
        j = letters.get()
        if j == word[x]:
            tmp  = j
            # print(tmp)
            break
        else:
            letters.put(j)
    x = x  1
    if tmp == word:
        counter  = 1
        tmp = ""
        x = 0
print(f"The word {word} occurs {counter} times in the string {given_string}.")
print("The left over word is",new_string)

  

Вывод будет:

 The word reindeer occurs 2 times in the string ierndeBeCrerindAeer.
The left over word is BCA
  

Здесь легко использовать queue, чтобы мы не повторяли элементы, которые уже присутствуют или найдены.
Надеюсь, это ответ на ваш вопрос, спасибо!

Комментарии:

1. Замена «оленей» в строке ничему не поможет