【问题标题】:Add an element in each dictionary of a list (list comprehension)在列表的每个字典中添加一个元素(列表理解)
【发布时间】:2012-12-13 19:25:02
【问题描述】:

我有一个字典列表,并且想为该列表的每个元素添加一个键。 我试过了:

result = [ item.update({"elem":"value"}) for item in mylist ]

但是update方法返回None,所以我的结果列表全是None。

result = [ item["elem"]="value" for item in mylist ]

返回语法错误。

【问题讨论】:

  • 为了澄清起见,即使第一种方法更新了称为my_list 的列表,这是所需的效果,resultNone 的列表,因为这是在每个项目列表上执行item.update 的结果,此函数本身不返回任何内容,as stated here

标签: python python-3.x list-comprehension


【解决方案1】:
>>> a = [ { 1:1 }, {2:2}, {3:3} ]
>>> for item in a:
...     item.update( { "test": "test" } )
... 
>>> a
[{'test': 'test', 1: 1}, {'test': 'test', 2: 2}, {'test': 'test', 3: 3}]

您错误地使用了列表推导,对item.update 的调用返回了None 值,因此您新创建的列表将充满None 值,而不是您预期的dict 值。

您只需遍历列表中的项目并相应地更新每个项目,因为列表包含对 dict 值的引用。

【讨论】:

    【解决方案2】:

    您无需担心构建新的词典列表,因为对更新词典的引用与对旧词典的引用相同:

     for item in mylist:
        item.update( {"elem":"value"})
    

    【讨论】:

      【解决方案3】:

      要么不使用列表推导,要么根据原始字典和新键返回一个字典:

      [dict(list(item.items()) + [("elem", "value")]) for item in mylist]
      

      【讨论】:

        【解决方案4】:

        如果您想使用列表推导,这里有一个很好的答案: https://stackoverflow.com/a/3197365/4403872

        在你的情况下,它会是这样的:

        result = [dict(item, **{'elem':'value'}) for item in myList]
        

        例如:

        myList = [{'a': 'A'}, {'b': 'B'}, {'c': 'C', 'cc': 'CC'}]
        

        然后使用任一

        result = [dict(item, **{'elem':'value'}) for item in myList]
        

        result = [dict(item, elem='value') for item in myList]
        

        最后,

        >>> result
        [{'a': 'A', 'elem': 'value'},
         {'b': 'B', 'elem': 'value'},
         {'c': 'C', 'cc': 'CC', 'elem': 'value'}]
        

        【讨论】:

          【解决方案5】:

          你可以使用地图。

          result = map(lambda item: dict(item, elem='value'), myList)
          

          如果您已经有了可以执行的元素列表:

          #elements = ['value'] * len(myList)
          result = map(lambda item: dict(item[0], elem=item[1]),zip(myList,elements))
          

          那么你就有了结果

          【讨论】:

            【解决方案6】:

            @vk1011 的回答很好,可以用扩展运算符简洁地进行扩展,新的字典对象是一个额外的好处

            1. 要使用新的键覆盖任何现有键的值,您可以将扩展运算符放在新项之前

              result = [{**item, 'elem':'value'} for item in myList]
              
            2. 要用现有的值覆盖新条目的值,请在新条目之后使用扩展运算符

              result = [{'elem':'value', **item} for item in myList]
              

            这两种方法都会给出一个包含新项目的字典对象列表

            【讨论】:

              【解决方案7】:

              传统但比其他(复杂)答案更快:

              myList = [{'a': 'A'}, {'b': 'B'}, {'c': 'C', 'cc': 'CC'}]
              for item in myList: item['elem']='value'
              

              一些时间安排:

              %timeit result = [dict(item, **{'elem':'value'}) for item in myList]
              865 ns ± 8.89 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
              
              %timeit result = [dict(item, elem='value') for item in myList]
              854 ns ± 5.37 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
              
              %timeit result = list(map(lambda item: dict(item, elem='value'), myList))
              1.22 µs ± 86.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
              
              %timeit for item in myList: item.update({'elem':'value'})
              464 ns ± 3.72 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
              
              %timeit for item in myList: item['elem']='value'
              124 ns ± 0.31 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
              
              %timeit [dict(list(item.items()) + [("elem", "value")]) for item in myList]
              1.59 µs ± 14.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-11-09
                • 2022-08-11
                • 1970-01-01
                • 2021-07-16
                • 2021-01-21
                • 2017-11-23
                • 2011-03-22
                相关资源
                最近更新 更多