добавление индекса символа повторяющейся буквы внутри строки в словаре Python - PullRequest
0 голосов
/ 17 февраля 2019

Пример слова «яблоко»:

['a', 'p', 'p', 'l', 'e']
{'a': [[0], False], 'p': [[1], False], 'l': [[3], False], 'e': [[4], False]}

Я не могу понять, как добавить индексы букв, которые повторяются в слове, чтобы оно выглядело так:

{'a': [[0], False], 'p': [[1, 2], False], 'l': [[3], False], 'e': [[4], False]}

код, который я получил до сих пор:

def creer_dict_mot():
    letter_list = obtenir_lettres_mot()
    mot_choisi = "apple"
    letter_dict = {}
    for let in mot_choisi:
        letter_dict[let] = [[mot_choisi.index(let)], False]
    return letter_dict

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Две основные проблемы;

Первая : Давайте посмотрим на этот цикл:

for let in mot_choisi:
    letter_dict[let] = [[mot_choisi.index(let)], False]

Здесь, при каждой итерации цикла вы перезаписываетезапись для letter_dict для этого письма.Вы не хотите этого делать, потому что в итоге вы получите что-то вроде {'a': [[0], False], 'p': [[2], False], 'l': [[3], False], 'e': [[4], False]}, что по-прежнему не то, что вы хотите.

Вместо этого вы хотите иметь возможность обновлять свою запись в словаре, а не перезаписывать ее.Мы можем сделать это, проверив, есть ли у нас запись перед выполнением нашего назначения.

for let in mot_choisi:
    if not let in letter_dict:
        letter_dict[let] = [[mot_choisi.index(let)], False]
    else:
        # Instead of overwriting the dict, we grab the list from the dict value and update it
        letter_dict[let][0] += [mot_choisi.index(let)] 

Second: .index всегда возвращает индекс первого вхождения символа встрока.Поэтому, когда вы звоните 'apple'.index('p'), он всегда будет возвращать 1.Наблюдайте:

my_string = 'apple'
for let in my_string:
    idx = my_string.index(let)
    print(let, idx)
>>> ('a', 0)
>>> ('p', 1)
>>> ('p', 1) # The first occurrence is index 1
>>> ('l', 3)
>>> ('e', 4)

Как мы можем это исправить?Я бы порекомендовал изучить enumerate

my_string = 'apple'
for idx, let in enumerate(my_string):
    print(let, idx)
>>> ('a', 0)
>>> ('p', 1)
>>> ('p', 2) # Now we see the index we want
>>> ('l', 3)
>>> ('e', 4)

. Я оставлю читателю в качестве упражнения объединить решения этих двух проблем

0 голосов
/ 17 февраля 2019

Другой простой вариант - собрать ваши индексы в collections.defaultdict(), а затем изменить его в конце, добавив False:

from collections import defaultdict

word = 'apple'

d = defaultdict(list)
for idx, letter in enumerate(word):
    d[letter].append(idx)

print({k: [v, False] for k, v in d.items()})
# {'a': [[0], False], 'p': [[1, 2], False], 'l': [[3], False], 'e': [[4], False]}

Также строки примечаний являются итеративными, так что вы можете использовать 'apple' вместо ['a', 'p', 'p', 'l', 'e'].

0 голосов
/ 17 февраля 2019

Попробуйте это:

def creer_dict_mot():
    s = 'apple'
    d = {}
    for char in s:
        ind = [i for i, a in enumerate(s) if a == char]
        if char not in d:
            d[char] = [ind, False]
    return d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...