How do I merge a 2D array in Python into one string with List Comprehension?

后端 未结 8 686
囚心锁ツ
囚心锁ツ 2020-12-29 07:49

List Comprehension for me seems to be like the opaque block of granite that regular expressions are for me. I need pointers.

Say, I have a 2D list:

l         


        
相关标签:
8条回答
  • 2020-12-29 07:55

    There's a couple choices. First, you can just create a new list and add the contents of each list to it:

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

    Alternately, you can use the itertools module's chain function, which produces an iterable containing all the items in multiple iterables:

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

    If you take this approach, you can produce the string without creating an intermediate list:

    s = ",".join(itertools.chain(*li))
    
    0 讨论(0)
  • 2020-12-29 08:04

    Try that:

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

    You can read it like this:
    Give me the list of every ys.
    The ys come from the xs.
    The xs come from li.

    To map that in a string:

    ','.join(map(str,li2))
    
    0 讨论(0)
  • 2020-12-29 08:04

    My favorite, and the shortest one, is this:

    li2 = sum(li, [])
    

    and

    s = ','.join(li2)
    

    EDIT: use sum instead of reduce, (thanks Thomas Wouters!)

    0 讨论(0)
  • 2020-12-29 08:05

    There are many ways to do this problem. I like Numpy's tools because it is normally already imported in everything I do. However, if you aren't using Numpy for anything else this probably isn't a good method.

    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
    

    This would print [0 1 2 3 4 5 6 7 8] and then you can convert this into your string too.

    0 讨论(0)
  • 2020-12-29 08:06

    For the second one, there is a built-in string method to do that :

    >>> print ','.join(str(x) for x in li2)
    "0,1,2,3,4,5,6,7,8"
    

    For the first one, you can use join within a comprehension list :

    >>> print ",".join([",".join(str(x) for x in li])
    "0,1,2,3,4,5,6,7,8"
    

    But it's easier to use 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 is a module that help you to deal with common tasks with iterators such as list, tuples or string... It's handy because it does not store a copy of the structure you're working on but process the items one by one.

    EDIT : funny, I am learning plenty of way to do it. Who said that there was only one good way to do it ?

    0 讨论(0)
  • 2020-12-29 08:10
    import itertools
    itertools.flatten( li )
    
    0 讨论(0)
提交回复
热议问题