Распечатать двумерный список
У меня есть список, в котором есть другой список, и я хочу 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])