可以一次附加多个列表吗?(Python)

Possible to append multiple lists at once? (Python)

我有很多列表要附加到一个列表中,这个列表就是我要编写的程序中的"主"列表。有没有一种方法可以用一行代码而不是10行代码来实现这一点?我是个初学者,所以我不知道…

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

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

并希望将y和z附加到x。而不是执行以下操作:

1
2
x.append(y)
x.append(z)

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

1
x.append(y, z)

它也不起作用。


1
x.extend(y+z)

应该做你想做的

1
x += y+z

甚至

1
x = x+y+z


扩展我的评论

1
2
3
4
5
6
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]


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

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

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


要准确复制附加的效果,请尝试以下简单有效的函数:

1
2
3
4
5
6
7
8
a=[]
def concats (lists):
    for i in lists:
        a==a.append(i)


concats ([x,y,z])
print(a)

如果您喜欢更实用的方法,可以尝试:

1
2
3
4
5
6
7
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上。

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

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

请注意,我们的bfdl对lambdas、reduce和friends有保留意见:https://www.artima.com/weblogs/viewpost.jsp?线程=98196

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

我引用:"将两个参数的函数从左到右累计地应用于序列项,以便将序列减少到单个值。"

P.S.如https://stackoverflow.com/a/41752487/532513中所述,使用sum()是超级紧凑的,它似乎可以与列表一起使用,而且速度非常快(请参见https://stackoverflow.com/a/33277438/532513),但是python 3.6中的help(sum)有以下说法:

This function is intended specifically for use with numeric values and may reject non-numeric types.

虽然这有点令人担忧,但我可能会将它作为连接列表的第一个选项。


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

1
2
3
4
5
6
7
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']

在上面的表达式中,*作为args to chain对于搜索结果很重要,这与前面的chain(x,y,z)相同。另外,注意结果是散列排序的。


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

1
x.extend(y+z)

1
x=x+y+z