Python: Print items of a dictionary line by line (4 Ways)
In this article, we will discuss different ways to print line by line the contents of a dictionary or a nested dictionary in python.
As dictionary contains items as key-value pairs. So, first, let’s create a dictionary that contains student names and their scores i.e.
Now to print this dictionary, we directly pass it in the print function i.e.
the output will be like,
Although it printed the contents of the dictionary, all the key-value pairs printed in a single line. If we have big dictionaries, then it can be hard for us to understand the contents. Therefore, we should print a dictionary line by line. Let’s see how to do that,
Frequently Asked:
Print a dictionary line by line using for loop & dict.items()
dict.items() returns an iterable view object of the dictionary that we can use to iterate over the contents of the dictionary, i.e. key-value pairs in the dictionary and print them line by line i.e.
This approach gives us complete control over each key-value pair in the dictionary. We printed each key-value pair in a separate line.
Print a dictionary line by line by iterating over keys
We can iterate over the keys of a dictionary one by one, then for each key access its value and print in a separate line i.e.
Best Resources to Learn Python:
Output:
Although by this approach we printed all the key value pairs line by line this is not an efficient method as compared to the previous one because to access one key-value pair, we are performing two operations.
how to print a Python dictionary in columns
I want to be able to print this and other dictionaries of varying depths in aligned columns like the following:
I am aware of the pprint approach. It produces a printout like this:
This is not what I want, not simply because it includes the chain brackets and quotation marks, but because it does not align the sub-values into columns.
My attempt so far is as follows:
This produces the following:
This is approaching what I want, but I can’t figure a good way to get the alignment working. Can you think of a way of keeping track of how to align the values and then applying the appropriate indentation?
Как напечатать словарь построчно в Python?
Я только начал изучать словари, поэтому я не уверен, как это сделать.
9 ответов:
более обобщенное решение, которое обрабатывает произвольно-глубоко вложенные дикты и списки, было бы:
это производит выход:
я столкнулся с подобной необходимостью и разработать более надежную функцию в качестве упражнения для себя. Я включаю его сюда на случай, если он может быть полезен для другого. В управлении nosetest, я также нашел это полезно, чтобы иметь возможность указать выходной поток в звонок так, что sys.устройство может быть использовано вместо.
используя эту функцию, выход OP выглядит следующим образом:
который я лично нашел более полезным и описательным.
учитывая немного менее тривиальный пример:
запрошенное решение OP дает следующее:
в то время как «расширенная» версия дает это:
Я надеюсь, что это дает некоторое значение для следующего человека, который ищет этот тип функциональность.
вы могли бы использовать json модуль для этого. Элемент dumps функция в этом модуле преобразует объект JSON в правильно отформатированную строку, которую затем можно распечатать.
вывод выглядит как
The документация также указывает кучу полезных опций для этого метода.
у вас есть вложенная структура, поэтому вам также нужно отформатировать вложенный словарь:
печатается:
Как Martijn Pieters упоминалось в одном из комментариев выше PrettyPrint является хорошим инструментом для этой работы:
Как красиво распечатать вложенные словари?
4 в Python? Я попытался хорошенько распечатать с pprint() , но это не сработало:
Я просто хочу отступ ( «\t» ) для каждого вложения, чтобы получить что-то вроде этого:
Как я могу это сделать?
19 ответов
Я не уверен, как именно вы хотите, чтобы форматирование выглядело, но вы могли бы начать с такой функции:
Моей первой мыслью было, что сериализатор JSON, вероятно, довольно хорош во вложенных словарях, поэтому я бы обманул и использовал это:
Я написал этот простой код для печати общей структуры объекта json в Python.
Результат для следующих данных
Очень компактен и выглядит так:
Я взял ответ sth и немного изменил его в соответствии со своими потребностями во вложенных словарях и списках:
Который затем дает мне вывод, как:
Я просто возвращаюсь к этому вопросу после того, как принял sth и внес небольшую, но очень полезную модификацию. Эта функция печатает все ключи в дереве JSON , а также размер листовых узлов в этом дереве.
Очень хорошо, когда у вас есть большие объекты JSON и вы хотите выяснить, где находится мясо. Пример :
Это скажет вам, что большая часть данных, которые вас интересуют, вероятно, находится внутри JSON_object[‘key1’][‘key2’][‘value2’] , потому что длина этого значения, отформатированного в виде строки, очень велика.
Вот кое-что, что напечатает любой вложенный словарь, отслеживая при этом «родительские» словари.
Это хорошая отправная точка для печати в различных форматах, например, в OP. Все, что вам действительно нужно, это операции с блоками Print . Обратите внимание, что он проверяет, является ли значение OrderedDict (). В зависимости от того, используете ли вы что-то из коллекций типов данных контейнера, вы должны сделать это сортировка по сбоям, поэтому блок elif не видит его как дополнительный словарь из-за его имени. На данный момент пример словаря, как
изменение кода в соответствии с форматом вопроса
Используя тот же пример кода, он напечатает следующее:
Это не точно , что запрашивается в OP. Разница в том, что родительский ^ n все еще печатается, вместо того, чтобы отсутствовать и заменяться пробелом. Чтобы перейти к формату OP, вам нужно сделать что-то вроде следующего: итеративно сравнить dicList с lastDict . Вы можете сделать это, создав новый словарь и скопировав в него содержимое dicList, проверив, совпадает ли i в скопированном словаре с i в lastDict, и — если он is — запись пробела в эту позицию i с использованием функции умножения строк.
Sth, я тону, это красиво;)
Другой вариант с yapf :
Я сам относительный новичок в Python, но последние пару недель я работал с вложенными словарями, и это то, что я придумал.
Вы должны попробовать использовать стек. Сделайте ключи из корневого словаря в список списка:
Идя в обратном порядке от последнего к первому, ищите каждый ключ в словаре, чтобы увидеть, является ли его значение (также) словарем. Если нет, распечатайте ключ и удалите его. Однако если значение для ключа равно словаря, напечатайте ключ, затем добавьте ключи для этого значения в конец стека и начните обрабатывать этот список таким же образом, повторяя рекурсивно для каждого нового список ключей.
Если бы значение для второго ключа в каждом списке было словарным, у вас было бы что-то вроде этого после нескольких раундов:
Преимущество этого подхода в том, что отступ в \t раз превышает длину стека:
Недостатком является то, что для проверки каждого ключа необходимо выполнить хеширование до соответствующего под-словаря, хотя это можно легко сделать с помощью понимания списка и простого цикла for :
Имейте в виду, что этот подход потребует очистки завершающих пустых списков, и , чтобы удалить последний ключ в любом списке, за которым следует пустой список (что, конечно, может создать другой пустой список и т. Д.).
Есть и другие способы реализации этого подхода, но, надеюсь, это даст вам базовое представление о том, как это сделать.
РЕДАКТИРОВАТЬ: Если вы не хотите проходить через все это, модуль pprint печатает вложенные словари в хорошем формате.
pout может довольно печатать все, что вы к нему добавляете, например (заимствование data из другого ответа ) :
Приведет к выводу на экран, например:
Или вы можете вернуть форматированную строку вывода вашего объекта:
Его основной сценарий использования предназначен для отладки, поэтому он не задыхается от экземпляров объектов или чего-либо еще и обрабатывает вывод в Unicode, как и следовало ожидать, работает в python 2.7 и 3.
Раскрытие информации . Я являюсь автором и сопровождающим Pout.
Вот функция, которую я написал на основе комментариев. Он работает так же, как json.dumps с отступом, но я использую вкладки вместо места для отступов. В Python 3.2+ вы можете указывать отступ как ‘\ t’ напрямую, но не в 2.7.
Вот что я придумал, работая над классом, который должен был написать словарь в .txt файле:
Теперь, если у нас есть словарь, подобный этому:
Вы можете попробовать YAML через PyYAML. Его выход может быть точно настроен. Я бы предложил начать со следующего:
print yaml.dump(data, allow_unicode=True, default_flow_style=False)
Результат очень читабельный; при необходимости его также можно проанализировать обратно в Python.
Изменить:
Используйте эту функцию:
Назовите это так:
Что касается того, что было сделано, я не вижу симпатичного принтера, который по крайней мере имитирует вывод интерпретатора python с очень простым форматированием, так что вот мой:
Чтобы инициализировать это:
Он может поддерживать добавление форматеров для определенных типов, вам просто нужно создать для этого функцию, подобную этой, и связать ее с нужным вам типом с помощью set_formater:
По историческим причинам я сохранил предыдущий симпатичный принтер, который был функцией вместо класса, но они оба могут использоваться одинаково, версия класса просто позволяет гораздо больше:
Чтобы использовать это:
По сравнению с другими версиями:
- Это решение напрямую ищет тип объекта, поэтому вы можете напечатать практически все, не только список или диктовку.
- Не имеет никакой зависимости.
- Все помещено в строку, так что вы можете делать с ней все, что захотите.
- Класс и функция были протестированы и работают с Python 2.7 и 3.4.
- Вы можете иметь все типы объектов внутри, это их представления, а не их содержимое, которое помещается в результат (поэтому строка имеет кавычки, строка Unicode полностью представлена . ).
- С версией класса вы можете добавить форматирование для каждого типа объекта или изменить их на уже определенные.
- ключ может быть любого допустимого типа.
- Отступы и символы новой строки могут быть изменены для всего, что мы хотели.
- Dict, List и Tuples довольно напечатаны.
Таким образом, вы можете распечатать его довольно хорошо, например, ваш словарь зовут Ясин