列表对我的理解似乎就像正则表达式适合我的花岗岩的不透明块。我需要指针。
说,我有一个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"
真的,我想知道如何做到这两点。
答案 0 :(得分:27)
像这样:
[ 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:
...
答案 1 :(得分:6)
试试:
li=[[0,1,2],[3,4,5],[6,7,8]]
li2 = [ y for x in li for y in x]
你可以这样读:
给我每个y的清单。
ys来自xs
xs来自li。
将其映射到字符串中:
','.join(map(str,li2))
答案 2 :(得分:5)
有几个选择。首先,您可以创建一个新列表并将每个列表的内容添加到其中:
li2 = []
for sublist in li:
li2.extend(sublist)
或者,您可以使用itertools
模块的chain
函数,该函数生成包含多个迭代中所有项的iterable:
import itertools
li2 = list(itertools.chain(*li))
如果采用这种方法,则可以在不创建中间列表的情况下生成字符串:
s = ",".join(itertools.chain(*li))
答案 3 :(得分:4)
答案 4 :(得分:0)
要使其成为扁平化列表,请使用:
然后,join
使其成为一个字符串。
答案 5 :(得分:0)
对于第二个,有一个内置的字符串方法来做到这一点:
>>> print ','.join(str(x) for x in li2)
"0,1,2,3,4,5,6,7,8"
对于第一个,您可以在理解列表中使用联接:
>>> 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是一个模块,可以帮助您处理与列表,元组或字符串等迭代器的常见任务...它很方便,因为它不存储您正在处理的结构的副本但处理项目一个接一个。
编辑:好笑,我正在学习很多方法。谁说只有一种好办法呢?答案 6 :(得分:0)
有很多方法可以解决这个问题。我喜欢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],然后您也可以将其转换为您的字符串。
答案 7 :(得分:0)
这里有一个方法:
def convert2DArrtostring(ndArr):
'''converts 2D array to string'''
arr_str = "["
for i in ndArr:
arr_str += "["
for j in i:
arr_str += str(j) + " "
arr_str += "]\n"
arr_str += "]"
return arr_str
答案 8 :(得分:-1)
import itertools
itertools.flatten( li )