Распечатать двумерный список

У меня есть список, в котором есть другой список, и я хочу doc.write(a)

a = [[1, 2, "hello"],
     [3, 5, "hi There"],
     [5,7,"I don't know"]]
doc.write(''.join(a))



TypeError: sequence item 0: expected str instance, list found

Как я могу справиться с этим, должен ли я сделать цикл for, в который я присоединюсь, и добавить все подсписки?

Реальная цель состояла в том, чтобы сделать его каким-то читаемым для человека, но я не хотел готового решения от вас.

Ответ 1

Вы можете попробовать что-то вроде

>>> a = [[1, 2, "hello"],[3, 5, "hi There"],[5,7,"I don't know"]]
>>> 
>>> ''.join(str(r) for v in a for r in v)
"12hello35hi There57I don't know"

то есть.

doc.write(''.join(str(r) for v in a for r in v))

Ответ 2

Есть разные юридические вещи, которые вы можете сделать, и никому не дано сказать, кто из них прав, не зная, какой из них вам нужен.


Сначала вы можете просто написать str или repr из a:

>>> a=[[1, 2, "hello"],[3, 5, "hi There"],[5,7,"I don't know"]]
>>> repr(a)
'[[1, 2, \'hello\'], [3, 5, \'hi There\'], [5, 7, "I don\'t know"]]'

Обратите внимание, что это то, что делает print (он печатает str того, что вы ему даете), хотя со списком str идентичен repr, оба они эффективно '[' + ', '.join(map(repr, self)) + ']').


Во-вторых, вы можете использовать формат, предназначенный для постоянного хранения данных, например JSON:

>>> json.dumps(a)
'[[1, 2, "hello"], [3, 5, "hi There"], [5, 7, "I don\'t know"]]'

В-третьих, вы можете объединить представление каждого элемента a каким-то образом по вашему выбору, что тривиально с map или пониманием. Например:

>>> '[' + ', '.join(map(repr, a)) + ']'
'[[1, 2, \'hello\'], [3, 5, \'hi There\'], [5, 7, "I don\'t know"]]'

... или...

>>> 'My stuff includes: ' + ','.join(map(repr, a)) + '\n'
'My stuff includes: [1, 2, \'hello\'],[3, 5, \'hi There\'],[5, 7, "I don\'t know"]\n'

Или вы можете сделать то же самое рекурсивно.

Или вы можете сгладить список (например, спрячьте его на один шаг с помощью itertools.chain или рекурсивно с рецептами из документов itertools или с пакетом more-itertools), а затем выполните строчку, но хотите, а затем присоединяйтесь к ним.

Или вы можете просто написать слово LIST.

Все это абсолютно правильные вещи, чтобы перейти на write.

Ответ 3

Оптимизация списка будет лучшим выбором:

>>> ''.join([str(item) for sublist in a for item in sublist])
"12hello35hi There57I don't know"

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

Ответ 4

Я тоже искал ответ на этот вопрос. После прочтения комментариев, вот что я придумал:

Я тоже искал ответ на этот вопрос. После прочтения комментариев, вот что я придумал:

','.join(str(' '.join(str(x) for x in v)) for v in a)

Это создает что-то вроде:

1 2 hello,3 5 hi There,5 7 I don't know

Если вы хотите, чтобы все пробелы использовались в качестве разделителей, используйте "" вместо "" в начале.

Ответ 5

Как насчет использования itertools?

from itertools import chain
doc.write(''.join(map(str, chain(a))))

В качестве альтернативы:

doc.write(''.join(str(i) for sub_list in a for i in sub_list))

Вы предложили использовать цикл for. Вы действительно можете это сделать, хотя варианты, возможно, лучше.

new_a = []
for sub_list in a:
    for i in sublist:
        new_a.append(str(i))
doc.write(''.join(new_a))

Это в основном предыдущий вариант, но разворачивается.

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

doc.write(''.join(map(str, a[0])))

Ответ 6

Мне трудно быть уверенным, потому что ваш вопрос слишком короткий, но мне кажется, что у вас проблема XY, то есть:
вы задаете вопрос о проблеме Y, о которой вы думаете, как о том, что нужно решить, чтобы уйти от проблемы X. Но ваша реальная проблема заключается в том, что вы думаете, что проблема Y - это способ ответить на реальную проблему X, и что вы представляете здесь только проблему Y.
Написав это, я только перефразирую сказанное здесь: Проблема XY

Если я прав, я считаю, что у вас будет лучший способ решить вашу реальную проблему X, используя один из следующих инструментов, которые позволяют сериализовать объект и записывать сериализованный объект в файл:

pickle

marshal

shelve

Я не буду перефразировать и повторить все документы этих инструментов, прочитайте их.

.

Если я ошибаюсь и что вы просто хотите написать объект в форме строкового представления, вы также можете сделать:

from pprint import pformat

a = [[1, 2, "hello"],
     [3, 5, "hi There"],
     [5,7,"I don't know"]]

with open('doc.txt','w') as f:
    f.write(pformat(a,width=12))

Ответ 7

Вы также можете просто использовать простое понимание списка следующим образом:

doc.write([x for x in i for i in a])