【问题标题】:How to print out a dictionary nicely in Python?如何在 Python 中很好地打印出字典?
【发布时间】:2017-11-25 03:38:12
【问题描述】:

我刚刚开始学习 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])

【问题讨论】:

  • "nicely" 是一个主观术语,但也许您正在寻找类似this 的东西。
  • 仅供参考,此示例代码根本不起作用。这里的for 循环会出错。我认为您的意思是使用range。此外,inventory_amounts 未使用,因此您没有打印值。

标签: python


【解决方案1】:

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

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)

【讨论】:

  • from pprint import pprint; pprint(dictionary) ... +1
  • 必须使用:对于项目,dct.items() 中的金额:而不是:对于项目,dct.iteritems() 中的金额:
  • 嗨,如果我想将输出保存为 .txt 文件,这是否有效?会以那种格式保存吗?
【解决方案2】:

我最喜欢的方式:

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

【讨论】:

  • 请注意,如果存在不同类型的键(例如整数和字符串键),sort_keys=True 会引发错误。
  • 您的字典必须只包含 JSON 可序列化对象,这些对象是字符串、各种数字和布尔值,才能正常工作。如果是这种情况,这是格式最好的最简单方法。
  • @sudo 你可以使用default=str 所以如果某些东西不是 JSON 可序列化的,它首先被转换为字符串
  • 可以按值排序吗?
【解决方案3】:

这是我要使用的单线。 (编辑:也适用于非 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 是的,比如"\n".join("{}\t{}".format(k, v) for k, v in sorted(dictionary.items(), key=lambda t: str(t[0])))
【解决方案4】:

我建议使用beeprint 而不是 pprint。

例子:

打印

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

蜜蜂印

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

【讨论】:

    【解决方案5】:

    Yaml 通常更具可读性,尤其是当您有复杂的嵌套对象、层次结构、嵌套字典等时:

    首先确保你有 pyyaml 模块:

    pip install pyyaml
    

    那么,

    import yaml
    print(yaml.dump(my_dict))
    

    【讨论】:

    • sudo apt install python-yaml 适用于 Ubuntu 16.04 用户。当字典值字符串包含 , 时存在一个小缺陷,但这是一个较小的输出缺陷。否则是一个很棒的工具。
    【解决方案6】:

    我写了这个函数来打印简单的字典:

    def dictToString(dict):
      return str(dict).replace(', ','\r\n').replace("u'","").replace("'","")[1:-1]
    

    【讨论】:

    • 在某些情况下,例如{"abc, abc": 123, "def": 456},会无法正常工作。
    【解决方案7】:

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

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

    【讨论】:

      【解决方案8】:

      我确实创建了函数(在 Python 3 中):

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 1970-01-01
        • 1970-01-01
        • 2019-10-07
        • 2019-06-27
        • 2015-07-05
        相关资源
        最近更新 更多