【问题标题】:Appending a list to a dictionary to get a nested list将列表附加到字典以获取嵌套列表
【发布时间】:2018-03-27 17:59:31
【问题描述】:

我一直在试图弄清楚如何将列表添加到字典中并在字典值中获取嵌套列表。这里以一个虚拟代码为例:

IN:

pets = dict()
pets['cat'] = list(['stray','brown','big'])
new_val = list(['house','white','small'])
pets['cat'].append(new_val)
print(pets)

OUT:
{'cat': ['stray', 'brown', 'big', ['house', 'white', 'small']]}

我正在尝试获取两个列表的列表:

{'cat': [['stray', 'brown', 'big'], ['house', 'white', 'small']]}

【问题讨论】:

  • 以下解决方案之一有帮助吗?如果是这样,请随意接受(左侧的绿色勾号),否则请随时要求澄清。

标签: python python-3.x list dictionary nested-lists


【解决方案1】:

在我看来,最简洁的方法是将值实例化为一个空列表。然后依次追加列表。

pets = {}
pets['cat'] = []

old_val = ['stray','brown','big']
pets['cat'].append(old_val)

new_val = ['house','white','small']
pets['cat'].append(new_val)

如果您经常这样做,请使用collections.defaultdict,这样您就不必手动实例化键和清空列表:

from collection import defaultdict

pets = defaultdict(list)

old_val = ['stray','brown','big']
pets['cat'].append(old_val)

new_val = ['house','white','small']
pets['cat'].append(new_val)

结果:

{'cat': [['stray', 'brown', 'big'],
         ['house', 'white', 'small']]}

【讨论】:

    【解决方案2】:

    您的主要问题是您没有将pets["cat"] 创建为二维列表。所以最小可行的解决办法是改变

    list(['stray','brown','big'])
    

    list([['stray','brown','big']]) 
    

    但你真的不需要list([...])。此方法本质上将传递的任何内容转换为“列表”类型。由于您已经使用[] 创建了一个列表,因此您无需调用list()。结果是将列表转换为列表,因此它只返回列表。你可以看看如果你做list(pets),你会得到一个字典键的列表。这就是字典转换为列表的方式(删除值并从键中创建一个列表)。如果您将单个字符串传递给它,它会使用该字符串创建一个列表。如果你什么都不传递,它会创建一个空列表。

    所以:

    pets['cat'] = list(['stray','brown','big'])
    new_val = list(['house','white','small'])
    

    应该是

    pets['cat'] = [['stray','brown','big']]
    new_val = ['house','white','small']
    

    输出:

    {'cat': [['stray', 'brown', 'big'], ['house', 'white', 'small']]}
    

    【讨论】:

      【解决方案3】:

      你也可以试试这个方法:

      list_1=[['stray','brown','big'],['house','white','small']]
      
      key='cat'
      dict_1={}
      for i in list_1:
          if key not in dict_1:
              dict_1[key]=[i]
          else:
              dict_1[key].append(i)
      print(dict_1)
      

      输出:

      {'cat': [['stray', 'brown', 'big'], ['house', 'white', 'small']]}
      

      【讨论】:

        【解决方案4】:

        这是一个可能的抽象,也使用defaultdict

        代码

        import collections as ct
        
        
        def append_lists(key, *iterables, defaultdict_=None):
            """Return a dict of lists."""
            if defaultdict_ is None:
                dd = ct.defaultdict(list)
            else:
                dd = defaultdict_.copy()
        
            for lst in iterables:
                dd[key].extend(lst)
            return dd
        

        演示

        给定一个键和一个可迭代的列表,构建一个列表字典:

        lists = ["stray", "brown", "big"], ["house", "white", "small"]
        
        d = append_lists("cat", lists)
        d
        # defaultdict(list,
        #             {'cat': [['stray', 'brown', 'big'], ['house', 'white', 'small']]})
        

        继续向原始字典添加条目:

        append_lists("dog", [["big", "wide", "yellow"]], defaultdict_=d)
        # defaultdict(list,
        #             {'cat': [['stray', 'brown', 'big'], ['house', 'white', 'small']],
        #              'dog': [['big', 'wide', 'yellow']]})
        

        注意,原来的字典被保留了:

        d
        # defaultdict(list,
        #             {'cat': [['stray', 'brown', 'big'], ['house', 'white', 'small']]})
        

        最后,我们可以从简单的键和项列表构建:

        animals = ["mouse", "bird"]
        features = (
            [["small", "brown", "cute"], ["small", "white", "fast"]], 
            [["large", "black", "fast"]]
        )
        
        result = ct.defaultdict(list)
        for k, items in zip(animals, features):
            result = append_lists(k, items, defaultdict_=result)
        
        result
        # defaultdict(list,
        #             {'bird': [['large', 'black', 'fast']],
        #              'mouse': [['small', 'brown', 'cute'],
        #               ['small', 'white', 'fast']]})
        

        【讨论】:

          猜你喜欢
          • 2020-06-01
          • 2021-06-08
          • 1970-01-01
          • 1970-01-01
          • 2021-05-10
          • 1970-01-01
          • 1970-01-01
          • 2021-07-02
          • 1970-01-01
          相关资源
          最近更新 更多