代码之家  ›  专栏  ›  技术社区  ›  Sam McAfee

如何使用列表理解将Python中的2D数组合并为一个字符串?

  •  22
  • Sam McAfee  · 技术社区  · 16 年前

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

    我有一个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"
    

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

    9 回复  |  直到 16 年前
        1
  •  32
  •   Thomas Wouters    16 年前

    像这样:

    [ item for innerlist in outerlist for item in innerlist ]
    

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

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

    是的,“用于外层列表中的内层列表”和“用于内层列表中的项目”的顺序是正确的。即使循环的“body”位于listcomp的开头,嵌套循环(和'if'子句)的顺序仍然与写出循环时的顺序相同:

    for innerlist in outerlist:
        for item in innerlist:
            ...
    
        2
  •  7
  •   Martin Cote    16 年前

    试试看:

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

    你可以这样读:
    把每个ys的清单给我。
    ys来自xs。
    xs来自李。

    要将其映射到字符串中,请执行以下操作:

    ','.join(map(str,li2))
    
        3
  •  6
  •   Allen    16 年前

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

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

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

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

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

    s = ",".join(itertools.chain(*li))
    
        4
  •  4
  •   Community CDub    8 年前

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

    li2 = sum(li, [])
    

    s = ','.join(li2)
    

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

        5
  •  0
  •   joeld    16 年前

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

    >>> 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"
    

    N.B:itertools是一个模块,它可以帮助您使用迭代器(如列表、元组或字符串)处理常见任务……它很方便,因为它不会存储您正在处理的结构的副本,而是逐一处理项目。

    编辑:有趣的是,我正在学习很多方法。谁说只有一种好方法?

        6
  •  0
  •   Eli Bendersky    16 年前
    import itertools
    itertools.flatten( li )
    
        7
  •  0
  •   Bite code    16 年前

    要使其成为扁平列表,请使用以下任一方法:

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

    然后, join 把它做成一根绳子。

        8
  •  0
  •   Alex    16 年前

    以下是一种方法:

    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
    
        9
  •  0
  •   Franco    4 年前

    有很多方法可以解决这个问题。我喜欢 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],然后您也可以将其转换为字符串。