Как определить совпадающие значения в словаре и создать новую строку только с этими ключами? - PullRequest
0 голосов
/ 29 декабря 2018

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

пример:

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

Ответы [ 4 ]

0 голосов
/ 29 декабря 2018

думаю самое простое решение из всех !!

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)
0 голосов
/ 29 декабря 2018

Другой подход заключается в использовании 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
0 голосов
/ 29 декабря 2018

Сначала создайте букву для подсчета сопоставления, затем измените это сопоставление.Использование модуля 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 имеет линейную сложность.

0 голосов
/ 29 декабря 2018

Из 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']})
...