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

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

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

На самом деле, я хотел бы знать, как это сделать.

Ответы

Ответ 1

Так же:

[ 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:
        ...

Ответ 2

Попробуйте следующее:

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

Ответ 3

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

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

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

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

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

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

Ответ 4

Мой любимый и самый короткий из них:

li2 = sum(li, [])

и

s = ','.join(li2)

EDIT: используйте sum вместо reduce, (спасибо Thomas Wouters!)

Ответ 6

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

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

NB: itertools - это модуль, который поможет вам справляться с общими задачами с помощью итераторов, таких как список, кортежи или строка... Это удобно, потому что оно не хранит копию структуры, над которой вы работаете, но обрабатываете элементы один за другим.

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

Ответ 7

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

Ответ 8

import itertools
itertools.flatten( li )