如何使用List Comprehension将Python中的2D数组合并为一个字符串?
对我来说,列表理解似乎就像正则表达式适合我的不透明花岗岩块。我需要指针。
说,我有一个2D列表:
li = [[0,1,2],[3,4,5],[6,7,8]]
我想将其合并为一个长列表
li2 = [0,1,2,3,4,5,6,7,8]
或者带分隔符的字符串中:
s = "0,1,2,3,4,5,6,7,8"
真的,我想知道两者都做。
解决方案
import itertools itertools.flatten( li )
要使其成为扁平化列表,请使用以下任一方法:
- http://code.activestate.com/recipes/121294/
- http://code.activestate.com/recipes/363051/
然后,join
使其成为字符串。
有几个选择。首先,我们可以创建一个新列表并将每个列表的内容添加到其中:
li2 = [] for sublist in li: li2.extend(sublist)
或者,我们可以使用itertools
模块的chain
函数,该函数会产生一个包含多个可迭代对象中所有项目的可迭代对象:
import itertools li2 = list(itertools.chain(*li))
如果采用这种方法,则可以在不创建中间列表的情况下生成字符串:
s = ",".join(itertools.chain(*li))
对于第二个,有一个内置的字符串方法可以做到这一点:
>>> print ','.join(str(x) for x in li2) "0,1,2,3,4,5,6,7,8"
对于第一个,我们可以在理解列表中使用join:
>>> print ",".join([",".join(str(x) for x in li]) "0,1,2,3,4,5,6,7,8"
但它更容易使用itertools.flatten:
>>> import itertools >>> print itertools.flatten(li) [0,1,2,3,4,5,6,7,8] >>> print ",".join(str(x) for x in itertools.flatten(li)) "0,1,2,3,4,5,6,7,8"
注意:itertools是一个模块,可以处理诸如迭代器,列表,元组或者字符串之类的迭代器的常见任务。这很方便,因为它不存储我们正在使用的结构的副本,而是逐个处理项目。
编辑:有趣,我正在学习很多方法。谁说只有一种好的方法呢?
我最喜欢的,也是最短的一个是:
li2 = sum(li, [])
和
s = ','.join(li2)
编辑:使用sum
代替reduce
,(感谢Thomas Wouters!)
像这样:
[ item for innerlist in outerlist for item in innerlist ]
将其直接转换为带分隔符的字符串:
','.join(str(item) for innerlist in outerlist for item in innerlist)
是的,"对于外部列表中的内部列表"和"对于内部列表中的项目"的顺序是正确的。即使循环的"主体"位于listcomp的开头,嵌套循环(和'if'子句)的顺序仍与编写循环时的顺序相同:
for innerlist in outerlist: for item in innerlist: ...
试试看:
li=[[0,1,2],[3,4,5],[6,7,8]] li2 = [ y for x in li for y in x]
我们可以这样阅读:
给我每个y的列表。
y来自xs。
xs来自li。
要将其映射为字符串:
','.join(map(str,li2))
有很多方法可以解决此问题。我喜欢Numpy的工具,因为通常我已经将其导入所有工作中。但是,如果我们没有将Numpy用于其他任何用途,则这可能不是一个好方法。
import numpy li = [[0,1,2],[3,4,5],[6,7,8]] li2=li[0] #first element of array to merge i=1 while i<len(li): li2=numpy.concatenate((li2,li[i])) i+=1 print li2
这将打印[0 1 2 3 4 5 6 7 8],然后我们也可以将其转换为字符串。