如何使用嵌套字典的名称?

时间:2016-05-17 05:47:16

标签: python python-3.x dictionary nested

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

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.

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

5 个答案:

答案 0 :(得分:3)

(更)正确的方法是构建dict dict代替,例如:

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))

答案 1 :(得分:2)

您基本上要做的是打印变量的名称。当然,这不是推荐的。如果你真的想这样做,你应该看一下这篇文章: How can you print a variable name in python?

我要做的是将字典的名称存储在列表中。您可以通过将'people = [sam,dave]'更改为'people = [[“sam”,sam],[“dave”,dave]]来实现此目的。这样,person [0]是人的名字,person [1]包含信息。

答案 2 :(得分:2)

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

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 + ".")

答案 3 :(得分:1)

列表中的值不再是变量。它们不是由某个名称空间中的名称引用,而是通过一个整数来表示它们从列表前面的偏移量(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变体)中。

答案 4 :(得分:0)

感谢您的出色表现。这个程序是Eric Matthes在“Python Crash Course”中的一个练习示例,因此低效的“列表内部列表”格式是有意的。也就是说,我从你的评论中得到了很多,并改变了我的代码以获得所需的输出:

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.

再次感谢所有提供深刻见解的人。