Добавление элементов в словарь Python

Возможно, я понял это неправильно, но, глядя на примеры, найденные в "Learning Python" О'Рейли, я попытался сделать следующее:

>>> d={}
>>> d['h']='GG'
>>> d['f']='JJ'
>>> d['h']='PP'
>>> print d
{'h': 'PP', 'f': 'JJ'}

Теперь вместо "ключа" 'h' имея две записи 'GG' а также 'PP' он имеет только последнюю запись, последняя заменяет первую. Я хочу ОБА в том же ключе.

>>> d['h']+='RR'
>>> print d
{'h': 'PPRR', 'f': 'JJ'}

Опять же, это не работает, я хотел не каскадную строку, а разделенные запятыми.

Я запутался, почему это не работает.

2 ответа

Решение

Ваш вариант использования хорошо обрабатывается collections.defaultdict() введите вместо:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d['h'].append('GG')
>>> d['f'].append('JJ')
>>> d['h'].append('PP')
>>> d
defaultdict(<type 'list'>, {'h': ['GG', 'PP'], 'f': ['JJ']})

Обычный словарь отображает один ключ на одно значение. Если вы хотите, чтобы это значение было списком, вы должны сделать его списком и вместо этого добавить его в список.

Вам не нужно использовать defaultdict() объект, вы всегда можете сделать свои значения явными списками:

>>> d = {}
>>> d['h'] = ['GG']
>>> d['f'] = ['JJ']
>>> d['h'].append('PP')
>>> print d
{'h': ['GG', 'PP'], 'f': ['JJ']}

но теперь вам нужно создать списки явно. Последняя проблема может быть затем снова обойдена с помощью dict.setdefault():

>>> d = {}
>>> d.setdefault('h', []).append('GG')
>>> d.setdefault('f', []).append('JJ')
>>> d.setdefault('h', []).append('PP')

который является просто более многословным способом использования того, что defaultdict() объекты могут предоставить напрямую.

Похоже, вы хотите, чтобы ваш словарь имел 'h' сопоставить со списком строк, что вы можете сделать следующим образом:

>>> d={}
>>> d['f']='JJ'
>>> d['h']=['PP']
>>> d['h'].append( 'RR' )
>>> d
{'h': ['PP', 'RR'], 'f': 'JJ'}

Если вы хотите, чтобы все ключи вашего словаря отображались в список (а не просто 'h'), ты можешь использовать collection.defaultdict как продемонстрировано в ответе @MartijnPieters.

Другие вопросы по тегам