如何将Python中的2D数组合并为一个包含List Comprehension的字符串?

Sam*_*fee 16 python list-comprehension

列表对我的理解似乎就像正则表达式适合我的花岗岩的不透明块.我需要指针.

说,我有一个2D列表:

li = [[0,1,2],[3,4,5],[6,7,8]]
Run Code Online (Sandbox Code Playgroud)

我想把它合并成一个长列表

li2 = [0,1,2,3,4,5,6,7,8]
Run Code Online (Sandbox Code Playgroud)

或者带分隔符的字符串:

s = "0,1,2,3,4,5,6,7,8"
Run Code Online (Sandbox Code Playgroud)

真的,我想知道如何做到这两点.

Tho*_*ers 28

像这样:

[ item for innerlist in outerlist for item in innerlist ]
Run Code Online (Sandbox Code Playgroud)

将其直接转换为带分隔符的字符串:

','.join(str(item) for innerlist in outerlist for item in innerlist)
Run Code Online (Sandbox Code Playgroud)

是的,'对于外部列表中的内部列表'和'对于内部列表中的项目'的顺序是正确的.即使循环的"主体"位于listcomp的开头,嵌套循环(和'if'子句)的顺序仍然与编写循环时的顺序相同:

for innerlist in outerlist:
    for item in innerlist:
        ...
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!在你用这种方式解释之前,这种顺序对我来说从来没有任何意义. (2认同)

All*_*len 6

有几个选择.首先,您可以创建一个新列表并将每个列表的内容添加到其中:

li2 = []
for sublist in li:
    li2.extend(sublist)
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用itertools模块的chain函数,该函数生成包含多个迭代中的所有项的iterable:

import itertools
li2 = list(itertools.chain(*li))
Run Code Online (Sandbox Code Playgroud)

如果采用此方法,则可以生成字符串而无需创建中间列表:

s = ",".join(itertools.chain(*li))
Run Code Online (Sandbox Code Playgroud)


dF.*_*dF. 6

我最喜欢的也是最短的一个是:

li2 = sum(li, [])
Run Code Online (Sandbox Code Playgroud)

s = ','.join(li2)
Run Code Online (Sandbox Code Playgroud)

编辑:使用sum而不是reduce, (感谢Thomas Wouters!)


Mar*_*ote 6

试试看:

li=[[0,1,2],[3,4,5],[6,7,8]]
li2 = [ y for x in li for y in x]
Run Code Online (Sandbox Code Playgroud)

你可以这样读:
给我每个y的列表.
ys来自xs.
xs来自li.

要在字符串中映射:

','.join(map(str,li2))
Run Code Online (Sandbox Code Playgroud)