【问题标题】:Possible to append multiple lists at once? (Python)可以一次附加多个列表吗? (Python)
【发布时间】:2012-12-17 09:14:04
【问题描述】:

我有一堆列表要附加到一个列表中,该列表是我正在尝试编写的程序中的“主”列表。有没有办法在一行代码而不是像 10 行代码中做到这一点?我是初学者,所以我不知道...

为了更好地了解我的问题,如果我有这些列表会怎样:

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]

并且想要将 y 和 z 附加到 x。而不是这样做:

x.append(y)
x.append(z)

有没有办法在一行代码中做到这一点?我已经试过了:

x.append(y, z)

而且它不会工作。

【问题讨论】:

  • 你真的想要.append,还是.extend?你明白其中的区别吗?
  • 你期望什么输出?
  • 不,我以前从未见过.extend,它有什么作用?
  • 你觉得 itertools.chain 怎么样?
  • .append 将向列表中添加一个元素。 .extend 会将一个列表连接到一个列表。

标签: python list append


【解决方案1】:
x.extend(y+z)

应该做你想做的事

x += y+z

甚至

x = x+y+z

【讨论】:

  • 请注意,最后一个略有不同 - 您正在创建一个新列表并将其分配给 x,而不是原地更改 x
  • 我试过 .extend 并且效果很好。感谢您的帮助。
  • extend 方法一直为我返回 None。
  • extendappend 方法返回 None,它们就地修改列表。
【解决方案2】:

扩展我的评论

In [1]: x = [1, 2, 3]
In [2]: y = [4, 5, 6]
In [3]: z = [7, 8, 9]
In [4]: from itertools import chain
In [5]: print list(chain(x,y,z))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

【讨论】:

  • 我发现有用的 itertools 选项的简单形式:itertools.chain([1, 2, 3], [4, 5, 6], [7, 8, 9]) = [1, 2, 3, 4, 5, 6, 7, 8, 9]
【解决方案3】:

等同于上述答案,但完全不同,值得一提:

my_map = {
   'foo': ['a', 1, 2],
   'bar': ['b', '2', 'c'],
   'baz': ['d', 'e', 'f'],
} 
list(itertools.chain(*my_map.values()))
['d', 'e', 'f', 'a', 1, 2, 'b', '2', 'c']

在上面的表达式中,*对于将结果作为参数链接到链很重要,这与先前的链(x,y,z)相同。另外,请注意结果是哈希排序的。

【讨论】:

    【解决方案4】:

    您可以使用sum 函数并指示起始值(空列表):

    a = sum([x, y, z], [])
    

    如果您想附加任意数量的列表,这尤其适合。

    【讨论】:

      【解决方案5】:

      如果您更喜欢功能性更强的方法,您可以尝试:

      import functools as f
      
      x = [1, 2, 3]
      y = [4, 5, 6]
      z = [7, 8, 9]
      
      x = f.reduce(lambda x, y: x+y, [y, z], x)
      

      这将使您能够将任意数量的列表连接到列表x

      如果您只想将任意数量的列表连接在一起(即不连接到某个基本列表),您可以简化为:

      import functools as f
      from operator import add
      big_list = f.reduce(add, list_of_lists)
      

      请注意,我们的 BFDL 对 lambdas、reduce 和朋友有所保留:https://www.artima.com/weblogs/viewpost.jsp?thread=98196

      要完成此答案,您可以在文档中阅读有关 reduce 的更多信息:https://docs.python.org/3/library/functools.html#functools.reduce

      我引用:“将两个参数的函数从左到右累积应用于序列项,以将序列减少为单个值。”

      附:使用sum() 中描述的https://stackoverflow.com/a/41752487/532513 是超级紧凑的,它似乎确实适用于列表,而且速度非常快(参见https://stackoverflow.com/a/33277438/532513)但是Python 3.6 中的help(sum) 有以下说明:

      此函数专门用于数值,可能会拒绝非数值类型。

      虽然这有点令人担忧,但我可能会将其作为连接列表的首选。

      【讨论】:

        【解决方案6】:

        在一行中,可以通过以下方式完成

        x.extend(y+z)
        

        x=x+y+z
        

        【讨论】:

          【解决方案7】:

          要准确复制append的效果,试试下面的函数,简单有效:

          a=[]
          def concats (lists):
              for i in lists:
                  a==a.append(i)
          
          
          concats ([x,y,z])
          print(a)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-22
            • 2010-10-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多