Обратный порядок/реверс словаря reversed(dict) в Python
Операция reversed(dict) возвращает обратный итератор по ключам словаря dict . Является ссылкой на операцию reversed(dict.keys()) .
Не путать с обратной сортировкой. Дополнительно смотрите встроенную функцию reversed() .
Операция поддерживается с версии Python-3.8.
Примеры вывода словаря с ключами в обратном порядке:
# Операция поддерживается Python-3.8 и выше >>> x = 'five': 5, 'two': 2, 'three': 3, 'one': 1, 'four': 4, 'six': 6> >>> y = reversed(x) >>> y # # До Python-3.8 разворачивать словарь можно так >>> x = 'five': 5, 'two': 2, 'three': 3, 'one': 1, 'four': 4, 'six': 6> >>> y = dict(reversed(x.items())) >>> y #
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Представления словарей dict.keys, dict.values и dict.items
- Исходный словарь для представления dictview.mapping
- Получение списка ключей словаря list(dict)
- Количество элементов в словаре len(dict)
- Доступ к значению словаря по ключу dict[key]
- Добавление/изменение значения словаря по ключу key
- Удаление значения словаря по ключу
- Проверка наличия/отсутствия ключа key в словаре dict
- Проверка наличия/отсутствия значения value в словаре Python
- Проверка наличия/отсутствия пары (key, value) в словаре dict
- Итерирование по ключам и значениям словаря Python
- Метод dict.clear(). Очистить словарь
- Метод dict.copy(), копия словаря
- Метод dict.fromkeys(), словарь с ключами по умолчанию
- Метод dict.get(), значение по умолчанию если ключа нет
- Метод dict.items(), список кортежей
- Метод dict.keys(), список ключей словаря
- Метод dict.values(), список значений словаря
- Метод dict.pop()
- Метод dict.popitem(), получить пару ключ/значение
- Метод dict.setdefault(), получает/вставляет значение ключа
- Метод dict.update(), обновление/дополнение словаря
- Объединение двух словарей в новый словарь Python
- Сортировка словаря по значению и/или ключу
- Обратный порядок/реверс словаря reversed(dict)
- Генератор словаря и его использование
- Фильтр словаря по ключам и/или значениям
- Словарь как фабрика функций
Инвертируем ключи и значения в словаре
Напишите функцию, которая будет менять местами ключи и значения в словаре.
Примеры:
invert(< "z": "q", "w": "f" >) ➞ < "q": "z", "f": "w" >invert(< "a": 1, "b": 2, "c": 3 >) ➞ < 1: "a", 2: "b", 3: "c" >invert(< "zebra": "koala", "horse": "camel" >) ➞
Варианты решения:
def invert(d): return
def invert(dct): return
def invert(dct): return dict(zip(dct.values(),dct.keys()))
def invert(dct): return dict(map(reversed, dct.items()))
Инвертировать отображение словаря Python
В этом посте мы обсудим, как инвертировать сопоставление словаря в Python. Предположим, что все значения в словаре уникальны.
1. Использование словарного понимания
Простое решение для инвертирования каждой пары ключ/значение словаря — использование понимания словаря, как показано ниже:
if __name__ == ‘__main__’ :
inverse_dict = < v : k for k , v in d . items ( ) >
print ( inverse_dict ) #
Кроме того, вы можете использовать конструктор словаря.
if __name__ == ‘__main__’ :
inverse_dict = dict ( ( v , k ) for k , v in d . items ( ) )
print ( inverse_dict ) #
2. Использование словарных итераторов
Самое быстрое решение — использовать итераторы словаря для перебора ключей словаря и создания нового словаря с обратным отображением.
if __name__ == ‘__main__’ :
inverse_dict = < d [ k ] : k for k in d >
print ( inverse_dict ) #
3. Использование map() функция
встроенный map() function предоставляет удобный способ применить функцию к каждому элементу iterable. Вы можете использовать это для создания обратного словаря, как показано ниже:
if __name__ == ‘__main__’ :
inverse_dict = dict ( map ( reversed , d . items ( ) ) )
print ( inverse_dict ) #
4. Преобразование на месте
Если вам нужно изменить словарь на месте вместо создания нового словаря вы можете создать копию словаря и обновить ее с помощью пар значение-ключ. Это показано ниже:
if __name__ == ‘__main__’ :
ref = d . copy ( )
d . update ( map ( reversed , ref . items ( ) ) )
Как обрабатывать дубликаты?
Если значения словаря не уникальны, вы можете использовать простой цикл for для обработки повторяющихся значений в словаре. Это показано ниже:
if __name__ == ‘__main__’ :
inverse_dict = < >
for k , v in d . items ( ) :
inverse_dict . setdefault ( v , [ ] ) . append ( k )
print ( inverse_dict ) #
Вот и все об инвертировании отображения словаря Python.
Оценить этот пост
Средний рейтинг 5 /5. Подсчет голосов: 25
Голосов пока нет! Будьте первым, кто оценит этот пост.
Сожалеем, что этот пост не оказался для вас полезным!
Расскажите, как мы можем улучшить этот пост?
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
Подписывайся
0 Комментарии
Встроенные отзывы
Просмотреть все комментарии
Загрузить больше комментариев
Просматривать
Подпишитесь на новые публикации
- Все проблемы
- Практика DSA
- 100 самых популярных задач
- 50 лучших классических задач
- Лучшие алгоритмы
- Компилятор С/С++
- Компилятор Java
- Компилятор Python
- Компилятор JavaScript
- компилятор PHP
- Компилятор C#
- Свяжитесь с нами
- Политика конфиденциальности
- условия обслуживания
- Подпишитесь на новые публикации
Techie Delight © 2023 Все права защищены.
Этот веб-сайт использует файлы cookie. Используя этот сайт, вы соглашаетесь с использованием файлов cookie, нашей политикой, условиями авторского права и другими условиями. Читайте наши Политика конфиденциальности. Понятно
Как инвертировать словарь без использования дополнительной памяти?
Пишу критичное по памяти и производительности приложение. Для некоторых повторящихся вычислений задекорировал функции с использованием техники memoization. Крупные неоднократно повторяющиеся объекты храню в таком кеше:
from collections import defaultdict from itertools import count cache = defaultdict(count().next)
Таким образом, каждый добавлемый в кеш объект получает уникальный последовательный индекс, т.е. в словаре уникальны не только ключи, но и значения. После окончания вычислений требуется восстановить объекты из кеша по индексу, для чего нужно инвертировать словарь. Он занимает сотни мегабайт, поэтому я ищу способ такого инвертирования cache -> xcache, которое не удваивало бы объём данных в памяти. Я хочу удалять элемент из одного словаря и сразу добавлять в другой, чтобы данные плавно «перетекли». Другими словами, в памяти не должны одновременно находиться два словаря с полным набором ключей и значений в каждом. Основная возникающая проблема — итерация по изменяющемуся словарю. Как это правильно реализовать?
- Вопрос задан более трёх лет назад
- 858 просмотров
Комментировать
Решения вопроса 2
> Он занимает сотни мегабайт
вы имеете в виду что данные хранящиеся в словаре занимают сотни мегабайт, или сам объект словаря занимает сотни мегабайт?
Поскольку от того, что вы инвертируете словарь, копий ключей и значений в памяти не появится, увлечение памяти будет только на саму структуру нового словаря.
Ответ написан более трёх лет назад
Нравится 1 11 комментариев

Andrey Dugin @adugin Автор вопроса, куратор тега Python
Хороший вопрос. Я просто смотрю объём используемой памяти в диспетчере. На самом деле, возможно, мне стоит попробовать не использовать словарь для кэширования, а просто функцию intern(), т.к. основной расход памяти — на длинные строки. Погуглю на эту тему.

собственно вот небольшой тест:
Line # Mem usage Increment Line Contents ================================================ 15 11.8 MiB 0.0 MiB @profile() 16 def test(): 17 11.9 MiB 0.0 MiB kol = 100000 18 11.9 MiB 0.0 MiB cache = dict() 19 234.0 MiB 222.1 MiB for x in xrange(kol): 20 234.0 MiB 0.0 MiB cache[get_random_hash(length=1000)] = count().next 21 240.7 MiB 6.8 MiB xcache =
собственно лишнее выделение памяти всего 6,8 мб, после инвертирования словаря.

Andrey Dugin @adugin Автор вопроса, куратор тега Python
Артём Клименко: Что-то меня сильно смущает конструкция count().next — не ли здесь ошибки? Каждый раз создаётся новый объект count и в кэш кладётся ссылка на его метод next, который никогда не вызывается. Что в итоге лежит в xcache?

Andrey Dugin @adugin Автор вопроса, куратор тега Python
Артём Клименко: Вне цикла следует создать cnt = count(), а в кэш класть cnt.next()

И правда, это я дал, маху, там каждый раз в значение словаря складывался новый экземпляр обёртки на функцией next класса count, именно в данном коде можно вообще на «x» заменить, но на итоговые результаты это никак не повлияет:
Line # Mem usage Increment Line Contents ================================================ 15 11.8 MiB 0.0 MiB @profile() 16 def test(): 17 11.8 MiB 0.0 MiB kol = 100000 18 11.9 MiB 0.0 MiB cache = dict() 19 11.9 MiB 0.0 MiB _count = count() 20 224.4 MiB 212.6 MiB for x in xrange(kol): 21 224.4 MiB 0.0 MiB cache[get_random_hash(length=1000)] = next(_count) 22 231.4 MiB 6.9 MiB xcache =

Andrey Dugin @adugin Автор вопроса, куратор тега Python
aklim007: Да, вот теперь вроде всё понятно. Спасибо за наглядный эксперимент! Действительно, чего-то я маху дал. Надо спать по ночам 🙂

Andrey Dugin @adugin Автор вопроса, куратор тега Python
Артём Клименко: P.S. Заменить на ‘x’ было бы неправильно, т.к. в этом случае инвертированный словарь будет состоять только из одного элемента.
