Как определить совпадающие значения в словаре и создать новую строку только с этими ключами?

У меня есть метод, который извлекает повторяющиеся буквы из строки и добавляет их в словарь с указанием количества раз, которое они повторяют в качестве значений. Теперь я хотел бы вытащить все ключи с совпадающими значениями и создать строку только с этими ключами.

пример:

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». Я просто хочу иметь возможность определить, какие буквы повторяются одинаковое количество раз.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
53
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Из словаря 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)

Другие вопросы по теме