【问题标题】:Printing dictornary with list order以列表顺序打印字典
【发布时间】:2015-05-30 06:36:54
【问题描述】:

我有以下代码,它是一个地址簿(一个字典列表)和一个列表。这个想法是按照列表的顺序打印字典中的项目(因为 dicts 搞乱了所有内容的顺序)。当我运行此代码时,它会引发异常(如下所示)。我不确定自己做错了什么,因为我尝试了许多不同的变体,但我一直想知道为什么它不起作用。

请帮忙?

addressBook = [
    {
    'Nickname': 'Jimmy',
    'Name': 'James Roberts',
    'Address': '2/50 Robe Street',
    'Phone': '0273503342'
    },
    {
    'Nickname': 'Bob',
    'Name': 'Robert',
    'Address': '1 Vivan Street',
    'Phone': '067578930'
    }
]

addressFields = ['Nickname', 'Name', 'Address', 'Phone']

def listAll(addressBook, addressFields):
    for i in addressBook:
        for key in addressFields:
            print("{0} {1}".format(key, addressBook[i][key]))

    print("{0} {1}".format(key, addressBook[i][key]))


TypeError: list indices must be integers, not dict

【问题讨论】:

    标签: python list dictionary printing format


    【解决方案1】:

    首先,在'James Roberts 之后的addressBook 文字中缺少'。其次,问题在于您正在使用addressBook[i][key] 而不是i[key]i 已经引用了包含在 addressBook 中的字典,因此您的代码试图使用 list 的元素作为自身的索引。

    def listAll(addressBook, addressFields):
        for i in addressBook:
            for key in addressFields:
                print('{} {}'.format(key, i[key]))
    

    Python 3 友好的单行代码:

    def listAll(addressBook, addressFields):
        print(*('{} {}'.format(j, i[j]) for i in addressBook for j in addressFields), sep='\n')
    

    【讨论】:

      【解决方案2】:

      或者在一行中:

      print('\n'.join(element for element in [j+" "+ i[j] for i in addressBook for j in addressFields]
      ))
      

      【讨论】:

      • 您可以按如下方式清理它:print(*(j+" "+ i[j] for i in addressBook for j in addressFields), sep='\n')element for element in 部分仅在您添加过滤条件时才需要(在这种情况下您不需要)。
      • FWIW,在列表 comp 上使用 .join 比在 gen exp 上更好:如果你给它一个 gen exp,它必须将它转换为一个列表。 .join 这样做的原因是它必须扫描数据两次:一次以确定所需的总字符串长度,然后再次实际构建字符串。如果不进行双重扫描,则必须使用重复的字符串连接来构建输出字符串,这是非常浪费的。
      【解决方案3】:
      #!/usr/bin/python
      
      addressBook = [{'Nickname': 'Jimmy', 'Name': 'James Roberts', 'Address': '2/50 Robe Street', 'Phone': '0273503342'},{'Nickname': 'Bob', 'Name': 'Robert', 'Address': '1 Vivan Street', 'Phone': '067578930'}]
      
      addressFields = ['Nickname', 'Name', 'Address', 'Phone']
      
      def listAll(addressBook, addressFields):
        for i in addressBook:
          for val in addressFields:
            print("{0} {1}".format(val, i[val]))
      
      listAll(addressBook, addressFields)
      

      【讨论】:

        【解决方案4】:

        发布此问题后,我找到了答案。

        我将 addressBook for 循环转换为 range(len(addressBook)) 并且它起作用了。

        for i in range(len(addressBook)):
        

        【讨论】:

        • 在 Python 中,for i in range(len(x)) 很少是正确的方法。问题不在于你如何设置循环,而在于你在里面做了什么。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多