Этот вопрос уже имеет ответ здесь:
Я плохо знаком с Python, и у меня есть список лет и значений в течение каждого года. То, что я хочу сделать, проверить, существует ли год уже в словаре и если он делает, добавьте значение к тому списку значений для определенного ключа.
Так, например, я имею список лет и имею одно значение в течение каждого года:
2010
2
2009
4
1989
8
2009
7
То, что я хочу сделать, заполняют словарь с годами как ключи и те единственные числа цифры как значения. Однако, если мне перечислили 2009 дважды, я хочу добавить то второе значение к своему списку значений в том словаре, таким образом, я хочу:
2010: 2
2009: 4, 7
1989: 8
Прямо сейчас у меня есть следующее:
d = dict()
years = []
(get 2 column list of years and values)
for line in list:
year = line[0]
value = line[1]
for line in list:
if year in d.keys():
d[value].append(value)
else:
d[value] = value
d[year] = year
Если я могу перефразировать ваш вопрос, вам нужен словарь с годами в качестве ключей и массив для каждого года, содержащий список значений, связанных с этим годом, верно? Вот как бы я это сделал:
years_dict = dict()
for line in list:
if line[0] in years_dict:
# append the new number to the existing array at this slot
years_dict[line[0]].append(line[1])
else:
# create a new array in this slot
years_dict[line[0]] = [line[1]]
То, что вы должны получить в years_dict, - это словарь, который выглядит следующим образом:
{
"2010": [2],
"2009": [4,7],
"1989": [8]
}
В общем, создание «параллельных массивов», где элементы неявно связаны, является плохой практикой программирования. друг с другом, имея один и тот же индекс, а не являясь собственными дочерними элементами контейнера, который охватывает их обоих.
Вам лучше всего использовать collections.defaultdict
(добавлено в Python 2.5). Это позволяет указать тип объекта по умолчанию отсутствующего ключа (например, list
).
Таким образом, вместо того, чтобы создавать ключ, если он не существует, а затем прилагать к значению ключа, вы вырезаете посредника и просто напрямую добавляете к несуществующим ключам, чтобы получить желаемый результат.
Быстрый пример использования ваших данных:
>>> from collections import defaultdict
>>> data = [(2010, 2), (2009, 4), (1989, 8), (2009, 7)]
>>> d = defaultdict(list)
>>> d
defaultdict(<type 'list'>, {})
>>> for year, month in data:
... d[year].append(month)
...
>>> d
defaultdict(<type 'list'>, {2009: [4, 7], 2010: [2], 1989: [8]})
Таким образом, вам не нужно беспокоиться о том, видели ли вы цифру, связанную с годом или нет. Вы просто добавляете и забываете, зная, что отсутствующий ключ всегда будет списком. Если ключ уже существует, то он будет просто добавлен.
d = {}
# import list of year,value pairs
for year,value in mylist:
try:
d[year].append(value)
except KeyError:
d[year] = [value]
Путь Python - легче получить прощение, чем просить разрешения!
Вы можете использовать setdefault
.
for line in list:
d.setdefault(year, []).append(value)
Это работает, потому что setdefault возвращает список, а также устанавливает его в словаре, и поскольку список является изменяемым, добавление к версии, возвращаемой setdefault, является тем же самым, что и добавление к версии внутри самого словаря. Если это имеет какой-то смысл.