Словари и списки позиций слова в списке - PullRequest
0 голосов
/ 12 декабря 2011

Мне нужно взять список и использовать словарь для каталогизации, где конкретный элемент встречается в списке, например:

L = ['a', 'b', 'c',' b ',' c ',' a ',' e ']

словарь должен содержать следующее:

D = {' a ': 0, 5, 'b': 1, 3, 'c': 2, 4, 'e': 6}

Однако, если я использую то, что я написал:

for i in range(len(word_list)):
    if D.has_key('word_list[i]') == False:
        D['word_list[i]'] = i
    else:
        D[word_list[i]] += i

Затем я получаю KeyError для определенного слова, и я не понимаю, почему я должен получить ошибку.

Ответы [ 3 ]

6 голосов
/ 12 декабря 2011
if D.has_key('word_list[i]') == False:

Э-э, что?

По крайней мере, вы должны отбросить кавычки:

if D.has_key(word_list[i]) == False:

Но вы также неправильно используете ряд структур Python:

  1. Почему суммируются индексы?
  2. Почему вы сравниваете с False?
  3. Разве вы не должны использовать setdefault

Как это:

for i in range(len(word_list)):
   D.setdefault(word_list[i], []).append(i)
4 голосов
/ 12 декабря 2011

Я немного изменил ваше решение для работы

word_list = ['a', 'b', 'c', 'b', 'c', 'a', 'e']
dict = {'a': [], 'b': [], 'c': [], 'e': []}
for i in range(len(word_list)):
    if word_list[i] not in dict:
        dict[word_list[i]] = [i]
    else:
        dict[word_list[i]].append(i)

Результат

{'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]}
2 голосов
/ 12 декабря 2011

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

>>> from collections import defaultdict
>>> D = defaultdict(list)
>>> for i,el in enumerate(L):
    D[el].append(i)

>>> D
defaultdict(<type 'list'>, {'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]})

Если вы хотите придерживаться dict, исправляя ваш код, я бы придумал:

>>> D = {}
>>> for i,el in enumerate(L):
    if el not in D:
        D[el] = [i] #crate a new list
    else:
        D[el].append(i) #appending to the existing list


>>> D
{'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]}

Также в dict есть метод setdefault, который можно использовать:

>>> D = {}
>>> for i,el in enumerate(L):
    D.setdefault(el,[]).append(i)


>>> D
{'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]}

Но я предпочитаю использовать defaultdict из collections.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...