Как мне объединить 2D-массив в Python в одну строку с пониманием списка?
-
01-07-2019 - |
Вопрос
Понимание списка для меня похоже на непрозрачный кусок гранита, которым для меня являются регулярные выражения.Мне нужны подсказки.
Скажем, у меня есть 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"
На самом деле, я хотел бы знать, как сделать и то, и другое.
Решение
Вот так:
[ item for innerlist in outerlist for item in innerlist ]
Превращение этого непосредственно в строку с разделителями:
','.join(str(item) for innerlist in outerlist for item in 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.
Буква "у" происходит от буквы "х".
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)
Редактировать:использование sum
вместо того, чтобы reduce
, (спасибо Томас Ваутерс!)
Чтобы сделать его плоским списком, используйте либо:
Тогда, join
чтобы сделать из него строку.
Для второго варианта существует встроенный строковый метод для этого :
>>> print ','.join(str(x) for x in li2)
"0,1,2,3,4,5,6,7,8"
Для первого варианта вы можете использовать "присоединиться к списку понимания" :
>>> 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 - это модуль, который помогает вам решать обычные задачи с помощью итераторов, таких как список, кортежи или строка...Это удобно, потому что в нем не хранится копия структуры, над которой вы работаете, а обрабатываются элементы один за другим.
Редактировать :забавно, но я изучаю множество способов, как это сделать.Кто сказал , что есть только один хороший способ сделать это ?
Есть много способов решить эту проблему.Мне нравится 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] и затем вы также можете преобразовать это в свою строку.
import itertools
itertools.flatten( li )