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] |
您可以使用
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) |
这将使您能够将任意数量的列表连接到列表
如果只想将任意数量的列表连接在一起(即不连接到某个基列表上),可以简化为:
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中所述,使用
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 |