Словари (dict) и работа с ними. Методы словарей

Сегодня я расскажу о таком типе данных, как словари, о работе со словарями, операциях над ними, методах, о генераторах словарей.

Словари в Python — неупорядоченные коллекции произвольных объектов с доступом по ключу. Их иногда ещё называют ассоциативными массивами или хеш-таблицами.

Чтобы работать со словарём, его нужно создать. Сделать это можно несколькими способами. Во-первых, с помощью литерала:

>>> d = {}
>>> d
{}
>>> d = {'dict': 1, 'dictionary': 2}
>>> d
{'dict': 1, 'dictionary': 2}

Во-вторых, с помощью функции dict:

>>> d = dict(short='dict', long='dictionary')
>>> d
{'short': 'dict', 'long': 'dictionary'}
>>> d = dict([(1, 1), (2, 4)])
>>> d
{1: 1, 2: 4}

В-третьих, с помощью метода fromkeys:

>>> d = dict.fromkeys(['a', 'b'])
>>> d
{'a': None, 'b': None}
>>> d = dict.
fromkeys(['a', 'b'], 100) >>> d {'a': 100, 'b': 100}

В-четвертых, с помощью генераторов словарей, которые очень похожи на генераторы списков.

>>> d = {a: a ** 2 for a in range(7)}
>>> d
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36}

Теперь попробуем добавить записей в словарь и извлечь значения ключей:

>>> d = {1: 2, 2: 4, 3: 9}
>>> d[1]
2
>>> d[4] = 4 ** 2
>>> d
{1: 2, 2: 4, 3: 9, 4: 16}
>>> d['1']
Traceback (most recent call last):
  File "", line 1, in
    d['1']
KeyError: '1'

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

Что же можно еще делать со словарями? Да то же самое, что и с другими объектами: встроенные функции, ключевые слова (например, циклы for и while), а также специальные методы словарей.

dict.clear() — очищает словарь.

dict.copy() — возвращает копию словаря.

classmethod dict.fromkeys(seq[, value]) — создает словарь с ключами из seq и значением value (по умолчанию None).

dict.get(key[, default]) — возвращает значение ключа, но если его нет, не бросает исключение, а возвращает default (по умолчанию None).

dict.items() — возвращает пары (ключ, значение).

dict.keys() — возвращает ключи в словаре.

dict.pop(key[, default]) — удаляет ключ и возвращает значение. Если ключа нет, возвращает default (по умолчанию бросает исключение).

dict.popitem() — удаляет и возвращает пару (ключ, значение). Если словарь пуст, бросает исключение KeyError. Помните, что словари неупорядочены.

dict.setdefault(key[, default]) — возвращает значение ключа, но если его нет, не бросает исключение, а создает ключ со значением default (по умолчанию None).

dict.update([other]) — обновляет словарь, добавляя пары (ключ, значение) из other. Существующие ключи перезаписываются. Возвращает None (не новый словарь!).

dict.values() — возвращает значения в словаре.

Для вставки кода на Python в комментарий заключайте его в теги <pre><code>Ваш код</code></pre>

python — Добавить элемент в начало словаря

Вопрос задан

Изменён 1 год 1 месяц назад

Просмотрен 1k раз

Допустим у нас есть вот такой словарь:

d = {'one': 1, 'two': 2, 'three': 3}

Как нам добавить значение на начало словаря. Стандартное присваивание по типу d['four'] = 4 — Добавит элемент в конец списка.

  • python
  • python-3.x
  • словари

2

если ключи уникальные, то такой код дает необходимый результат:

d = {'one': 1, 'two': 2, 'three': 3}
d1 = {'four':  4}
d, d1 = d1, d
d.
update(d1) d # {'four': 4, 'one': 1, 'two': 2, 'three': 3}

существующие ключи update перезаписывает

Сделать новый словарь, в который сначала поместить этот новый элемент, а потом остальные.

d = {'one': 1, 'two': 2, 'three': 3}
d1 = {'four':  4}
for k,v in d.items():
    d1[k] = v
print(d1)

Либо использовать OrderedDict, в нём можно двигать элементы:

from collections import OrderedDict
d = {'one': 1, 'two': 2, 'three': 3}
d1 = OrderedDict(d)
d1['four'] = 4
d1.move_to_end('four', last=False)
d1 = dict(d1)
print(d1)

Либо сделать из словаря список, тогда можно вставить элемент в любую позицию. А потом сделать обратно словарь:

d = {'one': 1, 'two': 2, 'three': 3}
lst = list(d.items())
lst.insert(0, ('four', 4))
d1 = dict(lst)
print(d1)

Вывод везде будет одинаковый:

{'four': 4, 'one': 1, 'two': 2, 'three': 3}

0

Нашёл как по мне самое оптимальное решение проблемы:

d = {"one": 1, "two": 2, "three": 3}
new_dict = {"four": 4} | d
print(new_dict)
# {'four': 4, 'one': 1, 'two': 2, 'three': 3}

Новая фишка в python 3.

9.5.

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Добавление к списку в словаре Python

В этой статье мы увидим, как добавить к списку в словаре Python.

Метод 1: Использование знака += на ключе с пустым значением

В этом методе мы будем использовать оператор += для добавления списка в словарь, для этого мы возьмем словарь, а затем добавим элементы как список в словарь.

Python3

Детали = { "Пункт назначения" : "Китай" ,

"NSTionality" : "итальянский" , "" "" "". Details[ "Age" ] + = [ 20 , "Twenty" ]

print (Details)

Вывод:

 {'Назначение': 'Китай', 'Национальность': 'Итальянец', 'Возраст': [20, 'Двадцать']} 

Вы также можете добавить один элемент.

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

Python3

Подробная информация = {}

[

«Возраст» ] = " ] = " " ] = " " ] = " ] = " ] " ] "" ] .0015 [ 20 ]

print (Details)

   

if "Age" in Details:

    

Details[ " Возраст " ] . PAPPEND ( " Двадцать " )

Печать (Подробная информация)

: . {'Возраст': [20, 'Двадцать']}

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

Python3

from collections import defaultdict

   

Details = defaultdict( list )

Details[ "Country" ]. append( "India" )

print (Details)

Output:

 defaultdict(, {'Country': ['India']}) 

Поскольку append принимает только один параметр, чтобы вставить другой параметр, повторите метод append.

Python3

from collections import defaultdict

   

Details = defaultdict( list )

Details[ "Country" ].append ( "Индия" )

Подробная информация [ "Страна" ]. Приложение ( "Пакистан" )

.0016 (Подробности)

Вывод:

 defaultdict(<класс 'список'>, {'Страна': ['Индия', 'Пакистан']}) 

4:000 Использование метода () function

Мы будем использовать функцию обновления для добавления нового списка в словарь. Вы можете использовать функцию update() для встраивания словаря в другой словарь.

Python3

Детали = {}

Подробная информация [ "Возраст" ] = []

Подробно. 25 , 29 , 30 ]})

print (Details)

Output:

 {'Age': [18 , 20, 25, 29, 30]} 

Метод 5: Добавление списка непосредственно в словарь

Вы можете преобразовать список в значение для ключа в словаре Python, используя функцию dict().

Python3

Values ​​ = [ 18 , 20 , 25 , 29 , 30 ]

Детали = дикт ({ «Возраст» : значения})

Печать (Подробная информация)

Выход: 9003

. 29, 30]}


python - Как вставить пару ключ-значение в словарь в указанной позиции?

спросил

Изменено 1 год, 3 месяца назад

Просмотрено 47 тысяч раз

Как мне вставить пару ключ-значение в указанное место в словаре Python, загруженном из документа YAML?

Например, если словарь:

dict = {'Имя': 'Зара', 'Возраст': 7, 'Класс': 'Первый'}

Я хочу вставить элемент 'Телефон' :'1234' до «Возраст» и после «Имя» например.

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

Если мне дадут способ вставки в указанную позицию в OrderedDict , это тоже будет нормально.

  • питон
  • словарь
  • ямл

1

В python < 3.7 (или cpython < 3.6) вы не можете управлять порядком пар в стандартном словаре.

Если вы планируете часто выполнять произвольные вставки, я бы посоветовал использовать список для хранения ключей и словарь для хранения значений.

 mykeys = ['Имя', 'Возраст', 'Класс']
mydict = {'Имя': 'Зара', 'Возраст': 7, 'Класс': 'Первый'} # порядок не имеет значения
k, v = 'Телефон', '123-456-7890'
mykeys.insert(mykeys.index('Имя')+1, к)
mydict[k] = v
для k в mykeys:
    print(f'{k} => {mydict[k]}')
# Имя => Зара
# Телефон => 123-456-7890
# Возраст => 7
# Класс => Первый
 

Если вы планируете инициализировать словарь с упорядочением, содержимое которого вряд ли изменится, вы можете использовать структуру collections. OrderedDict , которая поддерживает порядок вставки.

 из импорта коллекций OrderedDict
data = [('Имя', 'Зара'), ('Телефон', '1234'), ('Возраст', 7), ('Класс', 'Первый')]
odict = OrderedDict(данные)
одикт
# OrderedDict([('Имя', 'Зара'),
# ("Телефон", "1234"),
# («Возраст», 7),
# ('Класс', 'Первый')])
 

Обратите внимание, что OrderedDict не поддерживает вставку в произвольные позиции (он запоминает только порядок, в котором ключи вставляются в словарь).

3

Вам нужно будет инициализировать ваш dict как OrderedDict. Создайте новый пустой OrderedDict, просмотрите все ключи исходного словаря и вставьте до/после, когда имя ключа совпадает.

 из pprint импортировать pprint
из коллекций импортировать OrderedDict
def insert_key_value (a_dict, ключ, pos_key, значение):
    new_dict = ЗаказанныйСлов()
    для k, v в a_dict.items():
        если k==pos_key:
            new_dict[key] = value # вставить новый ключ
        новый_дикт[к] = v
    вернуть new_dict
mydict = OrderedDict([('Имя', 'Зара'), ('Возраст', 7), ('Класс', 'Первый')])
my_new_dict = insert_key_value(mydict, "Телефон", "Возраст", "1234")
pprint (мой_новый_дикт)
 

1

Была такая же проблема, и она была решена, как описано ниже, без необходимости дополнительного импорта и всего нескольких строк кода. Протестировано с Python 3.6.9.

  1. Получить позицию ключа "Возраст", поскольку новая пара "ключ-значение" должна быть вставлена ​​до
  2. Получить словарь в виде списка пар ключ-значение
  3. Вставить новую пару "ключ-значение" в определенную позицию
  4. Создать словарь из списка пар ключ-значение
 mydict = {'Имя': 'Зара', 'Возраст': 7, 'Класс': 'Первый'}
печать (mydict)
# {'Имя': 'Зара', 'Возраст': 7, 'Класс': 'Первый'}
pos = список(mydict.keys()).index('Возраст')
элементы = список (mydict.items())
items.insert(pos, ('Телефон', '123-456-7890'))
mydict = dict (предметы)
печать (mydict)
# {'Имя': 'Зара', 'Телефон': '123-456-7890', 'Возраст': 7, 'Класс': 'Первый'}
 

Edit 2021-12-20:
Только что увидел, что есть доступный метод вставки ruamel.yaml, см. пример со страницы проекта:

 система импорта
из ruamel.yaml импортировать YAML
yaml_str = """\
имя_имя: Искусство
профессия: Архитектор # Это комментарий про профессию
о: Арт Ванделай — вымышленный персонаж, которого придумывает Джордж. ..
"""
ЯМЛ = ЯМЛ()
данные = yaml.load(yaml_str)
data.insert(1, 'фамилия', 'Ванделей', comment="новый ключ")
yaml.dump(данные, sys.stdout)
 

Это продолжение ответа nurp. У меня работало, но без гарантии.

 # Вставить элемент словаря в словарь в указанной позиции:
def insert_item (dic, item={}, pos=None):
    """
    Вставьте пару ключ-значение в упорядоченный словарь.
    Вставить перед указанной позицией.
    """
    из коллекций импортировать OrderedDict
    d = ЗаказанныйСлов()
    # прервать досрочно, если нет словаря:
    если не элемент или не экземпляр (элемент, дикт):
        print('Отмена. Элемент аргумента должен быть словарем.')
        вернуть диск
    # вставить куда угодно, если аргумент pos не указан:
    если не поз:
        dic.update(элемент)
        вернуть диск
    для item_k, item_v в item.items():
        для k, v в dic.items():
            # вставить ключ в указанную позицию:
            если к == поз:
                d[item_k] = item_v
            д[к] = v
    вернуть д
d = {'A': 'буква A', 'C': 'буква C'}
insert_item(['A', 'C'], элемент={'B'})
## Прерывание.  Элемент аргумента должен быть словарем.
insert_item(d, item={'B': 'буква B'})
## {'A': 'буква A', 'C': 'буква C', 'B': 'буква B'}
insert_item(d, pos='C', item={'B': 'буква B'})
# OrderedDict([('A', 'буква A'), ('B', 'буква B'), ('C', 'буква C')])
 

Будет ли это питоническим?

 def add_item(d, new_pair, old_key): # вставить новую пару (ключ, значение) после old_key
    n=список(d.keys()).index(old_key)
    вернуть {key:d.get(key,new_pair[1]) для ключа в списке(d.keys())[:n+1] +[new_pair[0]] + list(d.keys())[n +1:] }
 

ВВОД: new_pair=('Телефон',1234), old_key='Возраст'

ВЫВОД: {'Имя': 'Зара', 'Возраст': 7, 'Телефон': 1234, 'Класс': 'Первый'}

Простой воспроизводимый пример (с использованием zip() для распаковки и упаковки)

 ### Задача - Вставить «Бангладеш»: «Дакка» после «Индия» в словаре заглавных букв
## Данный словарь
Capitals = {'Франция':'Париж', 'Соединенное Королевство':'Лондон', 'Индия':'Нью-Дели',
            'Соединенные Штаты': 'Вашингтон, округ Колумбия', 'Германия': 'Берлин'}
## Шаг 1 - Разделить на 2 списка, содержащих: 1) ключи, 2) значения
страна, шапка = (список(tup) для tup в zip(*capitals. items()))
# или
страна, шапка = список(карта(список, zip(*capitals.items())))
печать(страна)
#> ['Франция', 'Соединенное Королевство', 'Индия', 'Соединенные Штаты', 'Германия']
печать (кепка)
#> ['Париж', 'Лондон', 'Нью-Дели', 'Вашингтон, округ Колумбия', 'Берлин']
## Шаг 2. Найдите индекс элемента перед точкой вставки (из любого из двух списков)
req_pos = country.index('Индия')
печать (req_pos)
#> 2
## Шаг 3 - Вставьте новую запись в указанную позицию в обоих списках
country.insert(req_pos+1, 'Бангладеш')
cap.insert(req_pos+1, 'Дакка')
печать(страна)
#> ['Франция', 'Соединенное Королевство', 'Индия', 'Бангладеш', 'США', 'Германия']
печать (кепка)
#> ['Париж', 'Лондон', 'Нью-Дели', 'Дакка', 'Вашингтон, округ Колумбия', 'Берлин']
## Шаг 4 - Заархивируйте 2 списка в словарь
заглавные буквы = dict(zip(страна, заглавная))
печать (заглавными буквами)
#> {'Франция': 'Париж', 'Соединенное Королевство': 'Лондон', 'Индия': 'Нью-Дели', 'Бангладеш': 'Дакка', 'Соединенные Штаты': 'Вашингтон, округ Колумбия', 'Германия' : 'Берлин'}
 

После того, как вы использовали load() (без опции Loader=RoundTripLoader ) и ваши данные находятся в dict() , это слишком поздно, так как порядок, который был доступен в файле YAML, обычно отсутствует ( порядок зависит от фактических используемых ключей, используемого python (реализация, версия и возможные параметры компиляции).