如何在Python中漂亮地打印字典?

150

我刚开始学习Python,并正在制作一个文字游戏。我希望有一个库存系统,但我似乎无法将字典打印出来而不显得丑陋。

这是我目前拥有的内容:

def inventory():
    for numberofitems in len(inventory_content.keys()):
        inventory_things = list(inventory_content.keys())
        inventory_amounts = list(inventory_content.values())
        print(inventory_things[numberofitems])

4
"nicely"是一个主观的词,但也许你想要找类似于这个的东西来美化输出嵌套字典的结果。 - Christian Dean
1
请注意,这段示例代码根本无法工作。这里的“for”循环将会出错。我认为你想使用一个“range”。另外,“inventory_amounts”没有被使用,所以你没有打印出值。 - sudo
如何漂亮打印嵌套字典 - Ciro Santilli OurBigBook.com
10个回答

179

我喜欢Python中包含的pprint模块(美化打印)。它可以用于打印对象,也可以格式化一个漂亮的字符串版本。

import pprint

# Prints the nicely formatted dictionary
pprint.pprint(dictionary)

# Sets 'pretty_dict_str' to the formatted string value
pretty_dict_str = pprint.pformat(dictionary)

但是听起来您正在打印出一个清单,用户可能希望看到类似以下内容的格式:

def print_inventory(dct):
    print("Items held:")
    for item, amount in dct.items():  # dct.iteritems() in Python 2
        print("{} ({})".format(item, amount))

inventory = {
    "shovels": 3,
    "sticks": 2,
    "dogs": 1,
}

print_inventory(inventory)

输出结果如下:

Items held:
shovels (3)
sticks (2)
dogs (1)

12
pprint模块中导入pprint函数,并对dictionary变量进行美观打印输出。然后将其行号加1。 - SpinUp __ A Davis
1
必须使用:for item, amount in dct.items():而不是:for item, amount in dct.iteritems(): - Abisdad
你好,如果我想将输出保存为 .txt 文件,这个代码能行吗?它会以那种格式保存吗? - Jalkhov
1
为了保持pprint的打印格式,您可以使用import pprint as pp,然后调用pp.pformat(object)来保留其字符串结构以进行日志记录、保存等操作... - dtlam26
如果字典的顺序很重要,你可能需要使用pprint.pprint(dictionary, sort_dicts=False) - Laurent Lyaudet

111

我最喜欢的方法:

import json
print(json.dumps(dictionary, indent=4, sort_keys=True))

2
请注意,如果存在不同类型的键(例如整数和字符串键),则 sort_keys=True 会引发错误。 - Kevin
5
为了让这个工作正常运行,你的字典必须只包含JSON可序列化对象,即字符串、各种数字和布尔值。如果满足这个条件,那么这是最简单、格式最好的方法。 - sudo
16
您可以使用default=str,这样如果某个对象无法被JSON序列化,它会先被转换为字符串。 - arod
它可以根据值进行排序吗? - alper

30
这里是我会使用的一句话代码。(编辑:也适用于非JSON可序列化的内容)
print("\n".join("{}\t{}".format(k, v) for k, v in dictionary.items()))

说明:这个代码通过遍历字典的键和值来创建一个格式化的字符串,每个字符串都是由键、制表符和值组成的。而"\n".join(...则在所有这些字符串之间添加换行符,形成一个新字符串。

示例:

>>> dictionary = {1: 2, 4: 5, "foo": "bar"}
>>> print("\n".join("{}\t{}".format(k, v) for k, v in dictionary.items()))
1   2
4   5
foo bar
>>>

编辑2:这是一个排序后的版本。

"\n".join("{}\t{}".format(k, v) for k, v in sorted(dictionary.items(), key=lambda t: str(t[0])))

它可以根据值进行排序吗? - alper
1
@alper 是的,可以使用类似 "\n".join("{}\t{}".format(k, v) for k, v in sorted(dictionary.items(), key=lambda t: str(t[0]))) 这样的代码。 - sudo

7
我建议使用beeprint代替pprint。
示例: pprint
{'entities': {'hashtags': [],
              'urls': [{'display_url': 'github.com/panyanyany/beeprint',
                        'indices': [107, 126],
                        'url': 'https://github.com/panyanyany/beeprint'}],
              'user_mentions': []}}

beeprint

{
  'entities': {
    'hashtags': [],
    'urls': [
      {
        'display_url': 'github.com/panyanyany/beeprint',
        'indices': [107, 126],
        'url': 'https://github.com/panyanyany/beeprint'}],
      },
    ],
    'user_mentions': [],
  },
}

但是你怎么使用它呢?我尝试了像文档中一样使用 from beeprint import pp,然后尝试调用 pp(dictionary_name),但它不起作用。 - fayssal el ansari

3

Yaml通常更易读,特别是当你有复杂的嵌套对象、层次结构、嵌套字典等情况时:

首先确保你已经安装了pyyaml模块:

pip install pyyaml

然后,
import yaml
print(yaml.dump(my_dict))

适用于Ubuntu 16.04用户的命令是sudo apt install python-yaml。当字典值字符串包含,时,存在一个小缺陷,但这只是一个次要的输出缺陷。除此之外,这是一个很棒的工具。 - WinEunuuchs2Unix

2

自 Python 3.6 开始,您可以使用 f-strings 来编写 @sudo 的一行代码,使其更加紧凑。

print("\n".join(f"{k}\t{v}" for k, v in dictionary.items()))

0

同意,“好看”是非常主观的。看看这是否有帮助,我一直在使用它来调试字典

for i in inventory_things.keys():
    logger.info('Key_Name:"{kn}", Key_Value:"{kv}"'.format(kn=i, kv=inventory_things[i]))

0

也许它不能满足所有的需求,但我刚试了一下,它得到了一个漂亮的格式化输出。所以只需将字典转换为数据框,基本上就完成了。

pd.DataFrame(your_dic.items())

您还可以定义列来更加提高可读性

pd.DataFrame(your_dic.items(),columns={'Value','key'})

所以试一试吧:

print(pd.DataFrame(your_dic.items(),columns={'Value','key'}))

0
我创建了一个函数(在Python 3中):
def print_dict(dict):
    print(

    str(dict)
    .replace(', ', '\n')
    .replace(': ', ':\t')
    .replace('{', '')
    .replace('}', '')

    )

0
我编写了这个函数来打印简单的字典:
def dictToString(dict):
  return str(dict).replace(', ','\r\n').replace("u'","").replace("'","")[1:-1]

在某些情况下,例如 {"abc, abc": 123, "def": 456},会出现错误的结果。 - dimmoborgir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接