У меня есть метод, который извлекает повторяющиеся буквы из строки и добавляет их в словарь с указанием количества раз, которое они повторяют в качестве значений. Теперь я хотел бы вытащить все ключи с совпадающими значениями и создать строку только с этими ключами.
пример:
text = "theerrrdd"
count = {}
same_value = ""
for ch in text:
if text.count(ch) > 1:
count[ch] = text.count(ch)
Как я могу проверить количество ключей с совпадающими значениями и, если они найдены, добавить эти ключи в same_value?
Итак, в этом примере «e» и «d» будут иметь значение 2. Я хочу добавить их к same_value, чтобы при вызове same_value возвращалось «ed». Я просто хочу иметь возможность определить, какие буквы повторяются одинаковое количество раз.






Из словаря counter создайте другой словарь со всеми теми же буквами счетчика в качестве значений и счетчиком в качестве ключа. Перебирайте значения этого вновь созданного словаря, чтобы найти все значения, длина которых больше 1, а затем сформировать строки:
from collections import defaultdict
text = "theerrrdd"
count = {}
new_dict = defaultdict(list)
for ch in text:
if text.count(ch) > 1:
count[ch] = text.count(ch)
for k, v in count.items():
new_dict[v].append(k)
same_values_list = [v for v in new_dict.values() if len(v) > 1]
for x in same_values_list:
print(''.join(x))
# ed
new_dict - это недавно созданный словарь с подсчетом в качестве ключа и всеми буквами с этим счетом в качестве значения для этого ключа:
print(new_dict)
# defaultdict(<class 'list'>, {2: ['e', 'd'],
# 3: ['r']})
Другой подход заключается в использовании set() для получения только уникальных символов в строке, цикла по набору и создания словаря, в котором счетчики являются ключами со списками символов для каждого счетчика. Затем вы можете сгенерировать строки для каждого счета с помощью join().
text = "theerrrdd"
chars = set(text)
counts = {}
for ch in chars:
ch_count = text.count(ch)
if counts.get(ch_count, None):
counts[ch_count].append(ch)
else:
counts[ch_count] = [ch]
# print string of chars where count is 2
print(''.join(counts[2]))
# OUTPUT
# ed
Сначала создайте букву для подсчета сопоставления, а затем переверните это сопоставление. Используя модуль collections:
from collections import defaultdict, Counter
text = 'theerrrdd'
# create dictionary mapping letter to count
letter_count = Counter(text)
# reverse mapping to give count to letters mapping
count_letters = defaultdict(list)
for letter, count in letter_count.items():
count_letters[count].append(letter)
Результат:
print(count_letters)
defaultdict(<class 'list'>, {1: ['t', 'h'],
2: ['e', 'd'],
3: ['r']})
Затем, например, count_letters[2] выдаст вам все буквы, которые дважды встречаются во входной строке.
Использование str.count в цикле неэффективно, поскольку требует полной итерации вашей строки за каждую букву. Другими словами, такой алгоритм имеет квадратичную сложность, а collections.Counter - линейную сложность.
Думаю самое простое решение из всех !!
from collections import Counter
text = "theerrrdd"
count = Counter(text)
same_value = ''.join([k for k in count.keys() if count[k] > 1])
print(count)
print(same_value)