Как создать словарь для подсчета индексов всех букв в слове?
Есть кортеж с цифрами например (1,5) цифры в кортеже означают индексы БУКВ слова. Например слово КУЛЬТУРА буква У находится на указнных индексах
Надо создать словарь подсчета индексов всех букв. Пример:
x={"У":[счетчик,счетчик,счетчик,счетчик,счетчик,]}
Ключ словаря это буква. Значение словаря это список индексов слова. Надо менять значение списка счетчик на +1 если оно встречается в слове но учитывая индекс списка и слова
Хочу ввести новую функцию в решатель игры поле чудес. https://rutube.ru/video/40e6f01a6acdf4e932a77ee0d6427cbf/
Ответы (5 шт):
Если я правильно понял, вопрос в том, сколько слов имеет заданную букву на заданном месте. Тогда это можно сделать так
words = [ "год",
"человек",
"время",
"дело",
"жизнь",
"день",
"рука",
"раз",
"работа",
"слово",
"место",
"лицо",
"друг",
"глаз",
"вопрос",
"дом",
"сторона",
"страна",
"мир",
"чемпионат",
]
count_len = max(map(len, words))
ru_letters = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
letter_pos = {
l : [0] * count_len
for l in ru_letters
}
for word in words:
for pos, l in enumerate(word.lower()):
try:
letter_pos[l][pos] += 1
except:
print(f"Слово: {word}, буква: {l}, позиция: {pos}")
print(letter_pos)
Результат
{'а': [0, 2, 1, 2, 0, 2, 1, 1, 0], 'б': [0, 0, 1, 0, 0, 0, 0, 0, 0], 'в': [2, 0, 0, 1, 1, 0, 0, 0, 0], 'г': [2, 0, 0, 1, 0, 0, 0, 0, 0], 'д': [4, 0, 1, 0, 0, 0, 0, 0, 0], 'е': [0, 5, 1, 0, 0, 1, 0, 0, 0], 'ё': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'ж': [1, 0, 0, 0, 0, 0, 0, 0, 0], 'з': [0, 0, 2, 1, 0, 0, 0, 0, 0], 'и': [0, 3, 0, 0, 1, 0, 0, 0, 0], 'й': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'к': [0, 0, 1, 0, 0, 0, 1, 0, 0], 'л': [1, 2, 2, 0, 0, 0, 0, 0, 0], 'м': [2, 0, 2, 1, 0, 0, 0, 0, 0], 'н': [0, 0, 1, 1, 1, 1, 1, 0, 0], 'о': [0, 3, 2, 4, 4, 1, 0, 0, 0], 'п': [0, 0, 1, 1, 0, 0, 0, 0, 0], 'р': [3, 2, 2, 2, 0, 0, 0, 0, 0], 'с': [3, 0, 1, 0, 0, 1, 0, 0, 0], 'т': [0, 2, 0, 1, 1, 0, 0, 0, 1], 'у': [0, 1, 1, 0, 0, 0, 0, 0, 0], 'ф': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'х': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'ц': [0, 0, 1, 0, 0, 0, 0, 0, 0], 'ч': [2, 0, 0, 0, 0, 0, 0, 0, 0], 'ш': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'щ': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'ъ': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'ы': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'ь': [0, 0, 0, 1, 1, 0, 0, 0, 0], 'э': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'ю': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'я': [0, 0, 0, 0, 1, 0, 0, 0, 0]}
def update_index(a, i):
if len(a) <= i:
a.extend((0, ) * (i - len(a) + 1))
a[i] += 1
def update_dict(d, word):
for i, c in enumerate(word):
update_index(d.setdefault(c, []), i)
def test():
d = {}
update_dict(d, "КУЛЬТУРА")
for k, v in d.items():
print(k, v)
test()
$ python dict-test.py К [1] У [0, 1, 0, 0, 0, 1] Л [0, 0, 1] Ь [0, 0, 0, 1] Т [0, 0, 0, 0, 1] Р [0, 0, 0, 0, 0, 0, 1] А [0, 0, 0, 0, 0, 0, 0, 1]
import collections
word = "abracadabra"
counter = collections.Counter(word)
for letter in counter:
lst = []
ind = 0
for __ in range(counter[letter]):
ind = word.index(letter, ind)
lst.append(ind)
ind += 1
dic[letter] = lst
Результат (в переменной dic):
{'a': [0, 3, 5, 7, 10], 'b': [1, 8], 'r': [2, 9], 'c': [4], 'd': [6]}
Объяснение:
collections.Counter() подсчитает количество появлений каждой буквы в его параметре:
collections.Counter(word)
возвратить результат в форме подобной словарю:
Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
Для всякой буквы letter (ключу в этом результате) применим цикл, зная, что он будет повторяться counter(letter) раз, чтобы постепенно найти все индекси этой буквы.
Если я правильно понял и на вход дается целое слово как "КУЛЬТУРА", а для каждой буквы нужно получить список длиной во всю длину слова из 0 и 1, то:
def get_char_indices(word):
word = word.upper()
char_indices = {char: [0] * len(word) for char in sorted(set(word))}
for i in range(len(word)):
char = word[i]
char_indices[char][i] = 1
return char_indices
test_word = 'КУЛЬТУРА'
indices = get_char_indices(test_word)
for k, v in indices.items():
print(k, v)
Вывод:
А [0, 0, 0, 0, 0, 0, 0, 1]
К [1, 0, 0, 0, 0, 0, 0, 0]
Л [0, 0, 1, 0, 0, 0, 0, 0]
Р [0, 0, 0, 0, 0, 0, 1, 0]
Т [0, 0, 0, 0, 1, 0, 0, 0]
У [0, 1, 0, 0, 0, 1, 0, 0]
Ь [0, 0, 0, 1, 0, 0, 0, 0]
P.S.: по давней традиции - однострочник:
word = 'Культура'
indices = {char: [int(word.upper()[i] == char) for i in range(len(word))] for char in sorted(set(word.upper()))}
Я так понимаю, что слово КУЛЬТУРА - это пример для матрицы. Автор имеет набор слов и хочет получить в каких позициях и сколько раз встречается каждая буква.
words = ('hello', 'it', 'is', 'language', 'python') #collection of words
result= dict()
for word in words:
for j, a in enumerate(word):
result.setdefault(a,dict())
positions = result.get(a)
positions.setdefault(j,0)
positions[j] = positions[j]+1
mx = max(map(lambda i: max(i[1].keys()), result.items()))
for alpha, positions in result.items():
lst = [0]
if mx>0:
lst *= mx+1
for index, count in positions.items():
lst[index] = count
result[alpha] = tuple(lst.copy())
for i in sorted(result):
print(i,':', result[i])