добавьте несколько значений для одного ключа в словаре [дубликат]

Этот вопрос уже имеет ответ здесь:

Я плохо знаком с 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  
129
задан martineau 1 October 2018 в 16:28
поделиться

4 ответа

Если я могу перефразировать ваш вопрос, вам нужен словарь с годами в качестве ключей и массив для каждого года, содержащий список значений, связанных с этим годом, верно? Вот как бы я это сделал:

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]
}

В общем, создание «параллельных массивов», где элементы неявно связаны, является плохой практикой программирования. друг с другом, имея один и тот же индекс, а не являясь собственными дочерними элементами контейнера, который охватывает их обоих.

186
ответ дан 24 November 2019 в 00:26
поделиться

Вам лучше всего использовать 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]})

Таким образом, вам не нужно беспокоиться о том, видели ли вы цифру, связанную с годом или нет. Вы просто добавляете и забываете, зная, что отсутствующий ключ всегда будет списком. Если ключ уже существует, то он будет просто добавлен.

100
ответ дан 24 November 2019 в 00:26
поделиться
d = {} 

# import list of year,value pairs

for year,value in mylist:
    try:
        d[year].append(value)
    except KeyError:
        d[year] = [value]

Путь Python - легче получить прощение, чем просить разрешения!

19
ответ дан 24 November 2019 в 00:26
поделиться

Вы можете использовать setdefault.

for line in list:  
    d.setdefault(year, []).append(value)

Это работает, потому что setdefault возвращает список, а также устанавливает его в словаре, и поскольку список является изменяемым, добавление к версии, возвращаемой setdefault, является тем же самым, что и добавление к версии внутри самого словаря. Если это имеет какой-то смысл.

42
ответ дан 24 November 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: