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)
有几个选择.首先,您可以创建一个新列表并将每个列表的内容添加到其中:
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)
我最喜欢的也是最短的一个是:
li2 = sum(li, [])
Run Code Online (Sandbox Code Playgroud)
和
s = ','.join(li2)
Run Code Online (Sandbox Code Playgroud)
编辑:使用sum而不是reduce, (感谢Thomas Wouters!)
试试看:
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)