【问题标题】:more on creating dictionaries of dictionaries更多关于创建字典的字典
【发布时间】:2013-06-28 02:31:08
【问题描述】:

我是一个新手,正在学习 python 中的字典,并且花了一天的大部分时间来研究它,我将不胜感激!

我想创建一个字典字典:

data = [['dog', 'a'], ['mouse', 'a'], ['dog', 'b'], ['mouse', 'c'], ['dog', 'c']]
animals = ['dog', 'mouse']

我想这样做:

final = {'dog': {'a': 0, 'b': 0, 'c': 0}, 'mouse':{'a': 0, 'c': 0} }

到目前为止,我有这段代码,这显然是行不通的:

animal_dict = {}
for d in data:
    animal_dict[d[0]] = {}

letter_dict = {}
for animal in animal_dict:
    for d in data:
        if d[0] == animal:
            letter_dict[d[1]] = 0
            animal_dict[animal] = letter_dict

print animal_dict

请注意,它在 'mouse' 字典中添加了一个额外的键 ('b')。我知道我让它变得比它应该的更复杂!在此先感谢您对新手的帮助。

【问题讨论】:

    标签: python loops dictionary


    【解决方案1】:

    你真的只需要一个循环:

    data = [['dog', 'a'], ['mouse', 'a'], ['dog', 'b'], ['mouse', 'c'], ['dog', 'c']]
    animals = {}
    
    for animal, letter in data:
        animals.setdefault(animal, {})[letter] = 0
    

    或者如果你不喜欢setdefault:

    for animal, letter in data:
        if animal in animals:
            animals[animal][letter] = 0
        else:
            animals[animal] = {letter: 0}
    

    或者defaultdict:

    from collections import defaultdict:
    
    animals = defaultdict(dict) # creates a dict when the key doesn't exist
    
    for animal, letter in data:
        animals.[animal][letter] = 0
    

    【讨论】:

    • 非常感谢Blender! :) 我从这些帖子中学到了很多。
    【解决方案2】:

    您将animal_dict['dog']animal_dict['mouse'] 设置为同一个letter_dict 对象。您添加到一个的任何键都将添加到另一个。

    您实际上并不需要letter_dict。试试这个:

    for animal in animal_dict:
        for d in data:
            if d[0] == animal:
                animal_dict[animal][d[1]] = 0
    

    【讨论】:

      【解决方案3】:
      >>> d = {}
      >>> for i in data:
      ...     if i[0] not in d:
      ...             d[i[0]] = {i[1] : 0}
      ...     else:
      ...             d[i[0]][i[1]] = 0
      ... 
      >>> d
      {'mouse': {'a': 0, 'c': 0}, 'dog': {'a': 0, 'c': 0, 'b': 0}}
      

      您使用同一个字典来输入 dog 和 mouse 的值,因此额外的 'b' 键,因为已经有来自 dog 的 'b'。您可以创建一个 if/else 语句来区分每个。

      【讨论】:

        【解决方案4】:

        在将dict 添加到animal_dict 时,您使用的是相同的dict,因此有一个额外的b 键。您应该检查 animal in animal_dict 是否,如果不是,则添加带有空字典的新密钥。

        for animal in animal_dict:
            if not animal in animal_dict:
                animal_dict[animal] = {}
        
            for d in data:
                if d[0] == animal:
                    animal_dict[animal][d[1]] = letter_dict
        

        另一种选择是使用defaultdict documentation。这将消除循环中对密钥检查的需要。

        【讨论】:

          【解决方案5】:

          你不喜欢 Python 中有多少种不同的方式来做事吗? :-)

          您也可以在外循环内移动 letter_dict 的创建:

          for animal in animal_dict:
              letter_dict = {}    # Create new letter_dict for each animal
              for d in data:
                  if d[0] == animal:
                      letter_dict[d[1]] = 0
                      animal_dict[animal] = letter_dict
          

          【讨论】:

            【解决方案6】:

            又快又脏,动物名单真的没必要。

            d = {}
            for animal, letter in data:
                if not d.has_key(animal):
                    d[animal] = {}
                if not d[animal].has_key(letter):
                    d[animal][letter] = 0
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-07-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-11-17
              • 2017-05-05
              • 2021-06-25
              相关资源
              最近更新 更多