【问题标题】:How do I work with a nested dictionary's name?如何使用嵌套字典的名称?
【发布时间】:2016-09-13 01:54:42
【问题描述】:

我正在编写一个使用嵌套在列表中的字典的程序。我想在遍历列表时打印每个字典的名称,但不知道如何在不调用字典的全部内容的情况下执行此操作。这是我的代码:

sam = {
'food' : 'tortas',
'country' : 'mexico',
'song' : 'Dream On',
}
dave = {
    'food' : 'spaghetti',
    'country' : 'USA',
    'song' : 'Sweet Home Alabama',
    }

people = [sam, dave]

for person in people:
    for key, value in sorted(person.items()):
        print( #person's name +
                "'s favorite " + key + " is " + value + ".")

这是输出:

's favorite country is mexico.

's favorite food is tortas.

's favorite song is Dream On.

's favorite country is USA.

's favorite food is spaghetti.

's favorite song is Sweet Home Alabama.

一切正常,我只需要打印我的字典名称。解决办法是什么?

【问题讨论】:

  • 在这个意义上,对象没有“有”名字。您可以执行bob = dave 之类的操作,然后同一个对象有两个名称。如果您想要类似的东西,请添加另一层嵌套,使 'dave''sam' 成为键。

标签: python python-3.x dictionary nested


【解决方案1】:

感谢您的宝贵意见。该程序是 Eric Matthes 的“Python Crash Course”中的一个练习示例,因此低效的“列表中的字典”格式是故意的。也就是说,我从您的 cmets 中得到了很多,并更改了我的代码以获得所需的输出:

sam = {
    #Added a 'name' key-value pair.
    'name' : 'sam',
    'food' : 'tortas',
    'country' : 'mexico',
    'song' : 'Dream On',
    }
dave = {
    'name' : 'dave',
    'food' : 'spaghetti',
    'country' : 'USA',
    'song' : 'Sweet Home Alabama',
    }

people = [sam, dave]

for person in people:
    for key, value in sorted(person.items()):
        #Added if statement to prevent printing the name.
        if key != 'name':
            print(person['name'].title() + "'s favorite " + key + " is " + value + ".")
    #Added a blank line at the end of each for loop.
    print('\n')

这是输出:

Sam's favorite country is mexico.
Sam's favorite food is tortas.
Sam's favorite song is Dream On.


Dave's favorite country is USA.
Dave's favorite food is spaghetti.
Dave's favorite song is Sweet Home Alabama.

再次感谢所有提供有见地答案的人。

【讨论】:

    【解决方案2】:

    列表中的值不再是真正的变量。它们不是由某个命名空间中的名称引用,而是由一个整数表示,表示它们与列表前面的偏移量(01、...)。

    如果您想将每个dict 数据与某个名称相关联,您必须明确地执行此操作。有两种通用选项,具体取决于负责跟踪名称的对象:人员集合或集合中的每个人。

    第一个也是最简单的是collections.OrderedDict --- 与普通的dict 不同,它会保留您列表中人员的顺序。

    from collections import OrderedDict
    
    sam = {
      'food': 'tortas',
      'country': 'Mexico',
      'song': 'Dream On',
      }
    dave = {
      'food': 'spaghetti',
      'country': 'USA',
      'song': 'Sweet Home Alabama',
      }
    # The OrderedDict stores each person's name.
    people = OrderedDict([('Sam', sam), ('Dave', dave)])
    
    for name, data in people.items():
        # Name is a key in the OrderedDict.
        print('Name: ' + name)
        for key, value in sorted(data.items()):
            print('  {0}: {1}'.format(key.title(), value))
    

    或者,您可以将每个人的姓名存储在他或她自己的dict... 假设您可以更改这些词典的内容。 (此外,您不希望向数据字典添加任何需要您更改/更新数据的内容比您已经做的更多的内容。由于大多数人更改他们最喜欢的食物或歌曲的频率远高于更改他们的名字,因此可能是安全的。)

    sam = {
    # Each dict has a new key: 'name'.
      'name': 'Sam',
      'food': 'tortas',
      'country': 'Mexico',
      'song': 'Dream On',
      }
    dave = {
      'name': 'Dave',
      'food': 'spaghetti',
      'country': 'USA',
      'song': 'Sweet Home Alabama',
      }
    people = [sam, dave]
    
    for data in people:
        # Name is a value in the dict.
        print('Name: ' + data['name'])
        for key, value in sorted(data.items()):
            # Have to avoid printing the name again.
            if 'name' != key:
                print('  {0}: {1}'.format(key.title(), value))
    

    请注意,打印数据的方式取决于您是将姓名存储在集合中(OrderedDict 变体)还是每个人的 dictlist 变体)中。

    【讨论】:

      【解决方案3】:

      最简单的方法是将名称存储为映射到匹配变量标识符的字符串:

      people = {'sam':sam, 'dave':dave}
      
      for name, person in people.items():
          for key, value in sorted(person.items()):
              print(name + "'s favorite " + key + " is " + value + ".")
      

      如果您真的不喜欢每个名字输入两次的想法,您可以“内联”字典:

      people = {
          'sam':{
              'food' : 'tortas',
              'country' : 'mexico',
              'song' : 'Dream On',
          },
          'dave':{
             'food' : 'spaghetti',
             'country' : 'USA',
             'song' : 'Sweet Home Alabama',
          }
      }
      

      最后,如果您可以依赖全局命名空间中的这些变量,并且更关心使其工作而不是纯粹的实践,您可以通过以下方式找到它们:

      people = ['sam', 'dave']
      
      for name in people:
          person = globals()[name]
          for key, value in sorted(person.items()):
              print(name + "'s favorite " + key + " is " + value + ".")
      

      【讨论】:

        【解决方案4】:

        您基本上要做的是打印变量的名称。当然,不建议这样做。如果你真的想这样做,你应该看看这个帖子: How can you print a variable name in python?

        我要做的是将字典的名称存储在列表中。您可以通过将 'people = [sam, dave]' 更改为 'people = [["sam", sam], ["dave", dave]]' 来做到这一点。这样,person[0] 就是人名,而 person[1] 包含信息。

        【讨论】:

          【解决方案5】:

          这样做的(更)正确的方法是构造一个dictdicts 来代替,例如:

          people = {'sam': {'food' : 'tortas',
                            'country' : 'mexico',
                            'song' : 'Dream On',
                            },
                    'dave': {'food' : 'spaghetti',
                             'country' : 'USA',
                             'song' : 'Sweet Home Alabama',
                             }
                     }
          

          然后您可以简单地执行以下操作:

          for name, person in people.items():
              for key, value in sorted(person.items()):
                  print(name + "'s favorite " + key + " is " + value + ".")
          

          这将打印以下内容:

          dave's favorite country is USA.
          dave's favorite food is spaghetti.
          dave's favorite song is Sweet Home Alabama.
          sam's favorite country is mexico.
          sam's favorite food is tortas.
          sam's favorite song is Dream On.
          

          附带说明,在print 语句中使用字符串格式更易读:

          print("{0}'s favorite {1} is {2}".format(name, key, value))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-10-12
            • 2021-03-04
            • 1970-01-01
            • 2015-07-03
            • 1970-01-01
            • 1970-01-01
            • 2021-09-27
            • 1970-01-01
            相关资源
            最近更新 更多