Автор оригинала: Chris.
Словарь понимание Является ли красным и эффективным способом Создание и инициализация словарей в одной строке кода Python. Он состоит из двух частей: выражения и контекста. выражение Определяет, как отображать ключи к значениям. контекст Петли по поводу передового использования одной строки для петли и определяют пары, которые (ключ, значение) пары включают в новый словарь.
В следующем примере показано, как использовать понимание словаря для создания сопоставления от женщин к человеку:
men = ['Bob', 'Frank', 'Pete'] women = ['Alice', 'Ann', 'Liz'] # One-Liner Dictionary Comprehension pairs = {w:m for w, m in zip(women, men)} # Print the result to the shell print(pairs) # {'Bob': 'Alice', 'Frank': 'Ann', 'Pete': 'Liz'}
Далее вы погрузитесь в короткие упражнения Python, чтобы открыть и закрывать ваши пробелы знаний и укрепить ваше интуитивное понимание.
Interactive Python Shell.
Выполните следующее одноклассное понимание словаря в Interactive Code Shell:
Упражнение : Измените код так, чтобы каждое значение X отображалось на свой куб х ** 3 для первых одиннадцати значений от 0 до 10 (включительно)!
Связанная статья: Каждый мастер Python также освоил структуру данных словаря. Ознакомьтесь с нашим полным руководством в блоге Finxter здесь.
Далее вы погрузитесь даже глубже в мощный оператор понимания словаря в пошаговой манере!
Python Словарь Понимание ZIP
Понимание словаря позволяет создавать словари в чистое, легко понимать и пифитон. Однако, если у вас есть два Списки , вы можете создать словарь из них, используя Dict (
zip ()
)
Отказ
names = ['Adam', 'Beth', 'Charlie', 'Dani', 'Ethan'] countries = ['Argentina', 'Bulgaria', 'Colombia', 'Denmark', 'Estonia'] dict_zip = dict(zip(names, countries)) >>> dict_zip {'Adam': 'Argentina', 'Beth': 'Bulgaria', 'Charlie': 'Colombia', 'Dani': 'Denmark', 'Ethan': 'Estonia'}
Вы также можете сделать это, используя для цикла
>>> new_dict = {} >>> for name, country in zip(names, countries): new_dict[name] = country >>> new_dict {'Adam': 'Argentina', 'Beth': 'Bulgaria', 'Charlie': 'Colombia', 'Dani': 'Denmark', 'Ethan': 'Estonia'}
Вы инициализируете свои переменные Dict и Iterator с описательными именами. Чтобы воплотить за обеими списками одновременно, вы их свяжитесь вместе. Вы добавляете пар клавиши по желанию. Это занимает 3 строки.
Использование словаря, понимание превращает это в одну строку! 😲
dict_comp = {name: country for name, country in zip(names, countries)} >>> dict_comp {'Adam': 'Argentina', 'Beth': 'Bulgaria', 'Charlie': 'Colombia', 'Dani': 'Denmark', 'Ethan': 'Estonia'}
Подразделения словаря немного похоже на Для петлей в обратном порядке Отказ Во-первых, мы заявляем, что мы хотим, чтобы наши пары ключевых ценностей будут. Затем мы используем то же самое для петли и оберните все в фигурных скобках.
Обратите внимание, что каждое понимание можно записать как A для цикла. Если вы когда-нибудь получите результаты, вы не ожидаете, попробуйте в качестве цикла на петлю, чтобы увидеть, что происходит.
Вот распространенная ошибка
dict_comp_bad = {name: country for name in names for country in countries} >>> dict_comp_bad {'Adam': 'Estonia', 'Beth': 'Estonia', 'Charlie': 'Estonia', 'Dani': 'Estonia', 'Ethan': 'Estonia'}
В чем дело? Давайте напишем в виде цикла, чтобы увидеть. Во-первых, мы напишем это, чтобы убедиться, что мы получаем то же самое, нежелательно, результат.
bad_dict = {} for name in names: for country in countries: bad_dict[name] = country >>> bad_dict {'Adam': 'Estonia', 'Beth': 'Estonia', 'Charlie': 'Estonia', 'Dani': 'Estonia', 'Ethan': 'Estonia'}
Теперь мы будем использовать лучший друг ошибчаса: оператор печати!
# Don't initialise dict to just check for loop logic for name in names: for country in countries: print(name, country) Adam Argentina Adam Bulgaria Adam Colombia Adam Denmark Adam Estonia Beth Argentina Beth Bulgaria Beth Colombia ... Ethan Colombia Ethan Denmark Ethan Estonia
Здесь мы удаляем словарь, чтобы проверить, что на самом деле происходит в цикле. Теперь мы видим проблему! Вопрос у нас есть вложен для петлей Отказ Цикл говорит: для каждого имени пару его с каждой страной. Поскольку можно появиться только словарные ключи, значение перезаписывается на каждую итерацию. Таким образом, значение каждого ключа является окончательным, который появляется в петле – «Эстония»
Отказ
Решение состоит в том, чтобы удалить вложенные для петлей и использовать zip ()
вместо.
Python вложенные словари с пониманием словаря
nums = [0, 1, 2, 3, 4, 5] dict_nums = {n: {'even': n % 2 == 0, 'square': n**2, 'cube': n**3, 'square_root': n**0.5} for n in nums} # Pretty print for ease of reading >>> pprint(dict_nums) {0: {'cube': 0, 'even': True, 'square': 0, 'square_root': 0.0}, 1: {'cube': 1, 'even': False, 'square': 1, 'square_root': 1.0}, 2: {'cube': 8, 'even': True, 'square': 4, 'square_root': 1.4142135623730951}, 3: {'cube': 27, 'even': False, 'square': 9, 'square_root': 1.7320508075688772}, 4: {'cube': 64, 'even': True, 'square': 16, 'square_root': 2.0}, 5: {'cube': 125, 'even': False, 'square': 25, 'square_root': 2.23606797749979}}
Это где понятия становятся сильными. Мы определяем словарь в словаре, чтобы создать много информации в нескольких строках кода. Синтаксис точно такой же, как указано выше, но наше значение является более сложным, чем первый пример.
Помните, что наши пары ключевых ценностей должны быть уникальными и поэтому мы не можем создать словарь, как следующее
>>> nums = [0, 1, 2, 3, 4, 5] >>> wrong_dict = {'number': num, 'square': num ** 2 for num in nums} File "", line 1 wrong_dict = {'number': num, 'square': num ** 2 for num in nums} ^ SyntaxError: invalid syntax
Мы можем определить только один шаблон для пар клавиши в понимании. Но если бы вы могли определить больше, это не было бы очень полезно. Мы перезаписываем наши пары ключевых ценностей на каждой итерации, поскольку ключи должны быть уникальными.
If-Elif – иначе заявления
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # Just the even numbers even_squares = {n: n ** 2 for n in nums if n % 2 == 0} # Just the odd numbers odd_squares = {n: n ** 2 for n in nums if n % 2 == 1} >>> even_dict {0: 0, 2: 4, 4: 16, 6: 36, 8: 64, 10: 100} >>> odd_dict {1: 1, 3: 9, 5: 25, 7: 49, 9: 81}
Мы можем подать заявку, если условия после оператора. Это влияет на все значения, которые вы итерации.
Вы также можете применить их к вашим ключам и определениям стоимости. Теперь мы создадим разные пары клавишных значений на основе того, нечет ли число или даже.
# Use parenthesis to aid readability different_vals = {n: ('even' if n % 2 == 0 else 'odd') for n in range(5)} >>> different_vals {0: 'even', 1: 'odd', 2: 'even', 3: 'odd', 4: 'even'}
Мы можем получить действительно сложное и использовать формулировки, если/иначе в определениях ключевых значений, так и после цикла!
# Change each key using an f-string {(f'{n}_cubed' if n % 2 == 1 else f'{n}_squared'): # Cube odd numbers, square even numbers (n ** 3 if n % 2 == 1 else n ** 2) # The numbers 0-10 inclusive for n in range(11) # If they are not multiples of 3 if n % 3 != 0} {'1_cubed': 1, '2_squared': 4, '4_squared': 16, '5_cubed': 125, '7_cubed': 343, '8_squared': 64, '10_squared': 100}
Это относительно просто сделать это с использованием понятных. Пытаясь сделать это с петлей или Dict ()
Конструктор будет намного сложнее.
Альтернативные составы
Два утверждения на самом деле семантически идентичны:
dict([(i, chr(65+i)) for i in range(4)])
Идентичен:
{i : chr(65+i) for i in range(4)}
Примеры
Давайте рассмотрим пять примеров справедливости словаря для укрепления вашего понимания! Примеры улучшены и упрощенные версии кода, заданного здесь Отказ
Например, пример 1
Проблема : Создайте понимание диктоября из списка целых чисел.
# Example 1: # (key, value) --> (string, int) print({str(i):i for i in range(5)}) # {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}
Каждое целое число Я
сначала преобразуется в строку, используя str ()
Функция преобразования. Полученное отображение из ул. (I)
к Я
затем сохраняется в словаре для всех целочисленных ценностей Я
В 0, 1, 2, 3 и 4.
Например, пример 2
Проблема : Учитывая список имен фруктов как строки. Используйте понимание Dict для создания словаря с элементами списка в качестве клавиш и их длины в качестве значений.
# Example 2: fruits = ['apple', 'mango', 'banana','cherry'] d = {fruit:len(fruit) for fruit in fruits} print(d) # {'apple': 5, 'mango': 5, 'banana': 6, 'cherry': 6}
Вы повторяете каждый фрукт в списке. Затем вы сопоставляете каждую фруктовую струну к своей длине с помощью встроенного Python Лен ()
Функция, которая считает количество символов в строке.
Общемонтировать Пример 3
Проблема : Создайте словарь с пониманием Dict со элементами списка в качестве клавиш и их капитализированные вариантами в качестве значений.
# Example 3: d = {fruit:fruit.capitalize() for fruit in fruits} print(d) # {'apple': 'Apple', 'mango': 'Mango', 'banana': 'Banana', 'cherry': 'Cherry'}
string.capitalize ()
Функция капитализирует только первую букву данного строка
Отказ
Окормично понимание пример 4
Проблема : Используйте перечислять ()
Функция в списке для создания кортежей (I, X)
Для позиции Я
элемента x
. Используйте понимание Dict со списком элементов в качестве клавиш и их индексов в качестве значений.
# Example 4: d = {f:i for i,f in enumerate(fruits)} print(d) # {'apple': 0, 'mango': 1, 'banana': 2, 'cherry': 3}
Перечислять (фрукты)
Функция возвращает (индекс, элемент)
Пары потенциала фрукты
. Вы поймаете первое в переменной i
и последний в переменной f
. Теперь вы обращаете сопоставление через F: я
Отказ
Пример 5.
Проблема : Обратитесь за (ключ, значение
) сопоставления данного словаря. Грубо говоря, вы хотите получить (значение, ключ) сопоставления – хотя старые значения должны рассматриваться как новые ключи!
# Example 5: # Original dictionary: d = {str(i): i for i in range(5)} print(d) # {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4} # Reversed dictionary: d_r = {v:k for k,v in d.items()} print(d_r) # {0: '0', 1: '1', 2: '2', 3: '3', 4: '4'}
Вы используете Dict.items ()
Функция, чтобы вернуть пары (ключ, значение) из исходного словаря d
.
Давайте завернемся с интерактивным кодом, чтобы попробовать сами:
Упражнение : Измените заявление каждого словаря, изменяя хотя бы одну вещь!
Внешние ресурсы
В этом руководстве основано на различных ресурсах и онлайн-источниках.
- https://www.python.org/dev/peps/pep-0274/
- https://www.datacamp.com/community/tutorials/python-dictionary-comprehension
- https://cmdlinetips.com/2018/01/5-examples-using-dict-comprehension/
- https://stackoverflow.com/questions/14507591/python-dictionary-comprehension
Куда пойти отсюда?
Достаточно теории, давайте познакомимся!
Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?
Практические проекты – это то, как вы обостряете вашу пилу в кодировке!
Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?
Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.
Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.
Присоединяйтесь к свободному вебинару сейчас!
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.
Оригинал: “https://blog.finxter.com/python-dictionary-comprehension/”