Как объединить 2D-массив в Python в одну строку с пониманием списка?

понимание списка для меня похоже на непрозрачный гранитный блок, который регулярные выражения для меня. Мне нужны указатели.

Скажите, у меня есть список 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"

действительно, я хотел бы знать, как это сделать.

8 ответов


вот так:

[ item for innerlist in outerlist for item in innerlist ]

превращение этого непосредственно в строку с сепараторами:

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

Да, орден 'За innerlist в outerlist' и 'для элемента 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]

вы можете прочитать это так:
Дайте мне список всех ys.
Ys происходит от xs.
Xs происходят от li.

в карты, в строку:

','.join(map(str,li2))

есть несколько вариантов. Во-первых, вы можете просто создать новый список и добавить в него содержимое каждого списка:

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

можно использовать itertools модуль chain функция, которая создает итератор, содержащий все элементы в несколько итерируемых:

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

если вы примете этот подход, вы можете создать строку без создания промежуточного списка:

s = ",".join(itertools.chain(*li))

мой любимый, и самый короткий, это:

li2 = sum(li, [])

и

s = ','.join(li2)

EDIT: используйте sum вместо reduce (спасибо Томас Вутерс!)


чтобы сделать его сплющенным списком, используйте либо:

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

затем, join чтобы сделать его строку.


для второго есть встроенный строковый метод для этого:

>>> 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.сплющить:

>>> 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-это модуль, который поможет вам справиться с общими задачами с итераторами, такими как список, кортежи или строка... Это удобно, потому что он не хранит копию структуры, над которой вы работаете, а обрабатывает элементы по одному один.

EDIT: смешно, я изучаю много способов сделать это. Кто говорит, что есть только один хороший способ сделать это ?


есть много способов сделать эту проблему. Мне нравится включает в себяинструменты, потому что он обычно уже импортируется во все, что я делаю. Однако, если вы не используете 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] и тогда вы можете преобразовать это в строку.


import itertools
itertools.flatten( li )