2016-03-16 4 views
1

Я хочу словарь с 26 ключами без значения (по одному для каждой буквы), который будет читать строку и создать список, который будет содержать позиции буквы в строке, и связать его с ключ.Python: Словарь и списки

Пример: Если у меня есть следующая строка AZERTYUIOPAAAZ, в словаре ключ A должен иметь в качестве значения список [0,10,11,12], потому что мы находим букву A на эти позиции в строке. Мне удалось заставить словарь занять одну позицию для каждой буквы, но я не могу создать список со всеми позициями.

Вот мой код:

string1 = "SQUALALANOUSSOMESPARTISETJETEDTESTE" 
taille = len(string1) 
dictio = dict() 
dictio = {'A':None,'B':None,'C':None,'D':None,'E':None,'F':None,'G':None,'H':None,'I':None,'J':None,'K':None,'L':None,'M':None,'N':None,'O':None,'P':None,'Q':None,'R':None,'S':None,'T':None,'U':None,'V':None,'W':None,'X':None,'Y':None,'Z':None} 
a = 0 
for a in range(taille): 
    dictio[string1[a]] = a 
    print(dictio) 

ответ

2

Проблема ваша оператор присваивания:

dictio[string1[a]] = a

Вы назначаете целое a для данного значения в карте. Если вы хотите сохранить их все, вам нужно будет использовать список. Что-то вроде следующего:

for a in range(len(string1)): 
    if dictio[string1[a]] is None: 
     dictio[string1[a]] = [a] 
    else: 
     dictio[string1[a]].append(a) 
+1

Получение +1 для фактического объяснения причин неполадок исходной системы, которые я понял, что я этого не сделал. – BHustus

+0

Спасибо, это сработало. И я понял, где я потерпел неудачу. –

2

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

from collections import defaultdict 

word = "AZERTYUIOPAAAZ" 

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

print d['A'] # [0,10,11,12] 
+0

избил меня! Здесь у вас есть upvote –

2

Не красивое решение, но это, как разработана программа: Сделайте dictio = {'A':[],'B':[],'C':[],'D':[],...... и в петле dictio[string1[a]].append(a)

1

Есть несколько способов:

Фиксированный набор Словаре

string1 = "SQUALALANOUSSOMESPARTISETJETEDTESTE" 
dictio = {'A':[],'B':[],'C':[],'D':[],'E':[],'F':[],'G':[],'H':[],'I':[],'J':[],'K':[],'L':[],'M':[],'N':[],'O':[],'P':[],'Q':[],'R':[],'S':[],'T':[],'U':[],'V':[],'W':[],'X':[],'Y':[],'Z':[]} 

i = 0 
for char in string1: 
    dictio[char].append(i) 
    i += 1 

# {'L': [4, 6], 'A': [3, 5, 7, 18], 'Z': [], 'N': [8], 'J': [25], 'B': [], 'M': [14], 'C': [], 'S': [0, 11, 12, 16, 22, 32], 'K': [], 'W': [], 'Q': [1], 'O': [9, 13], 'R': [19], 'E': [15, 23, 26, 28, 31, 34], 'D': [29], 'P': [17], 'X': [], 'G': [], 'I': [21], 'H': [], 'Y': [], 'U': [2, 10], 'F': [], 'V': [], 'T': [20, 24, 27, 30, 33]} 

Переменный dict

string1 = "SQUALALANOUSSOMESPARTISETJETEDTESTE" 
dictio = {} 

i = 0 
for char in string1: 
    if char not in dictio: 
     dictio[char] = [] 
    dictio[char].append(i) 
    i += 1 

Вторая версия даст диктофон только с буквами, которые присутствуют.

+0

+1 для решения переменной dict. Если несущественные буквы несущественны, это решение предпочтительнее для экономии памяти. – BHustus

0

Как объяснил L-Jones, ваша оригинальная система выходит из строя, потому что вы устанавливаете значения словаря в каждой точке. Для того, чтобы объяснить, если вы выполните следующие действия:

a = 1 
a = 2 

a будет иметь значение 2, а не записи, имеющие значение 1. Это фактически то же самое, что и замена значений словаря на данном ключе.

Если вы инициализируете значения по умолчанию для словаря в пустом списке, [], вместо None вы можете использовать append, чтобы добавлять индексы там, где это необходимо. Смотрите следующее:

import string 
string1 = "SQUALALANOUSSOMESPARTISETJETEDTESTE" 
taille = len(string1) 
dictio = dict() 
dictio = {letter: [] for letter in string.ascii_uppercase} 
# The above is a shorter alternative to typing out all of the letter-empty list pairs by hand 
# a = 0 is unnecessary because a will be initialized to 0 with the range 
for a in range(taille): 
    dictio[string1[a]].append(a) 
print(dictio) 

Обратите внимание, что словарь не будет отсортирован A-Z, по причинам, я не совсем уверен, но он будет содержать все, что вам нужно.

Если вы не заботитесь о письмах без индексов, обратитесь к предлагаемому решению Нандера Шпеерстры в его ответе: переменная dict, которая не будет включать ключ, который не находится в строке. Это уменьшит стоимость памяти за счет небольшого количества накладных расходов, что, вероятно, пока не будет значительным. И если вы действительно хотите свести инструкцию:

import string 
string1 = "SQUALALANOUSSOMESPARTISETJETEDTESTE" 
taille = len(string1) 
dictio = dict() 
dictio = {letter: [] for letter in string.ascii_uppercase} 
for index, letter in zip(range(taille), string1): 
    dictio[letter].append(index) 
print(dictio) 

, который также может быть объединен с переменной системой dict.

Смежные вопросы