Как мне объединить 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"

На самом деле, я хотел бы знать, как сделать и то, и другое.

В подкасте №1 Джоэл задает этот точный вопрос как вопрос, который можно ввести в Google, чтобы получить Stack Overflow в качестве первого результата ... и это действительно так :-)

Yuval 15.06.2010 19:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
19
1
32 987
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

import itertools
itertools.flatten( li )

Нет itertools.flatten.

Antti Rasinen 19.09.2008 21:33

Думаю, он говорит о примере функции, показанной в документации itertools: docs.python.org/library/itertools.html В любом случае, не на основе понимания списка.

Peter Hosey 29.10.2008 07:11

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

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

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

Я не вижу функции сглаживания в itertools. Я использую Python 2.4.2

Arthur Thomas 19.09.2008 21:57

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

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

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

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

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

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

Идея хорошая, но вылетает из-за того, что вы не взяли машину с типом данных: <type 'exceptions.TypeError'>: элемент последовательности 0: ожидаемая строка, найдено int

e-satis 19.09.2008 21:48

Легко решается: ','. Join (itertools.imap (str, itertools.chain (* li)))

Peter Hosey 29.10.2008 06:47

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

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

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

Какую версию Python вы используете с itertools.flatten? Насколько я понимаю, это не часть стандартной библиотеки. Кроме того, есть поговорка «один-очевидный- путь», которая сильно отличается от «хорошо».

Matthew Trevor 21.09.2008 10:34

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

li2 = sum(li, [])

и

s = ','.join(li2)

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

Этот подход проще реализовать с помощью sum: sum (li, [])

Thomas Wouters 19.09.2008 21:28

Это не работает: <type 'exceptions.TypeError'>: reduce () arg 2 должен поддерживать итерацию

e-satis 19.09.2008 21:33
Ответ принят как подходящий

Вот так:

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

Спасибо! Этот порядок никогда не имел для меня никакого смысла, пока вы не объяснили его таким образом.

Nicholas Riley 20.09.2008 03:59

прикомандирован. Я бы хотел, чтобы этот ответ мне понравился больше, чем один раз!

mulllhausen 25.11.2014 16:36

Попробуй это:

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

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

Чтобы отобразить это в строке:

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

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

Вот способ:

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

Другие вопросы по теме