Как создать словарь для подсчета индексов всех букв в слове?

Есть кортеж с цифрами например (1,5) цифры в кортеже означают индексы БУКВ слова. Например слово КУЛЬТУРА буква У находится на указнных индексах

Надо создать словарь подсчета индексов всех букв. Пример:

x={"У":[счетчик,счетчик,счетчик,счетчик,счетчик,]}

Ключ словаря это буква. Значение словаря это список индексов слова. Надо менять значение списка счетчик на +1 если оно встречается в слове но учитывая индекс списка и слова

Хочу ввести новую функцию в решатель игры поле чудес. https://rutube.ru/video/40e6f01a6acdf4e932a77ee0d6427cbf/


Ответы (5 шт):

Автор решения: Pak Uula

Если я правильно понял, вопрос в том, сколько слов имеет заданную букву на заданном месте. Тогда это можно сделать так

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]}
→ Ссылка
Автор решения: Stanislav Volodarskiy
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]
→ Ссылка
Автор решения: MarianD
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) раз, чтобы постепенно найти все индекси этой буквы.

→ Ссылка
Автор решения: mrgervant

Если я правильно понял и на вход дается целое слово как "КУЛЬТУРА", а для каждой буквы нужно получить список длиной во всю длину слова из 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()))}
→ Ссылка
Автор решения: geo

Я так понимаю, что слово КУЛЬТУРА - это пример для матрицы. Автор имеет набор слов и хочет получить в каких позициях и сколько раз встречается каждая буква.

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])
→ Ссылка