20

列表理解对我来说似乎就像正则表达式对我来说是一块不透明的花岗岩。我需要指针。

说,我有一个二维列表:

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"

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

4

9 回答 9

32

像这样:

[ item for innerlist in outerlist for item in innerlist ]

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

','.join(str(item) for innerlist in outerlist for item in innerlist)

是的,“for innerlist in outerlist”和“for item in innerlist”的顺序是正确的。即使循环的“主体”位于 listcomp 的开头,嵌套循环(和“if”子句)的顺序仍然与您写出循环时的顺序相同:

for innerlist in outerlist:
    for item in innerlist:
        ...
于 2008-09-19T17:28:14.087 回答
7

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

li2 = []
for sublist in li:
    li2.extend(sublist)

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

import itertools
li2 = list(itertools.chain(*li))

如果您采用这种方法,您可以在不创建中间列表的情况下生成字符串:

s = ",".join(itertools.chain(*li))
于 2008-09-19T17:26:51.187 回答
7

试试看:

li=[[0,1,2],[3,4,5],[6,7,8]]
li2 = [ y for x in li for y in x]

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

要将其映射到字符串中:

','.join(map(str,li2))
于 2008-09-19T17:29:22.977 回答
4

我最喜欢的,也是最短的,是这样的:

li2 = sum(li, [])

s = ','.join(li2)

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

于 2008-09-19T17:27:43.820 回答
0
import itertools
itertools.flatten( li )
于 2008-09-19T17:24:56.760 回答
0

要使其成为扁平列表,请使用:

  1. http://code.activestate.com/recipes/121294/
  2. http://code.activestate.com/recipes/363051/

然后,join使它成为一个字符串。

于 2008-09-19T17:26:44.247 回答
0

对于第二个,有一个内置的字符串方法可以做到这一点:

>>> 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 是一个模块,可帮助您使用迭代器(例如列表、元组或字符串)处理常见任务......它很方便,因为它不存储您正在处理的结构的副本,而是一个一个地处理项目.

编辑:有趣,我正在学习很多方法来做到这一点。谁说只有一种好方法?

于 2008-09-19T17:26:52.107 回答
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] ,然后您也可以将其转换为您的字符串。

于 2008-10-28T19:17:27.197 回答
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
于 2021-01-18T14:12:37.437 回答