#python #formatting
#python #форматирование
Вопрос:
У меня есть функция, которая в настоящее время возвращает это:
[['o', 'o', 'o', 'o', 'o'], ['o', 'o', 'X', 'o', 'o'], ['o', 'o', 'o', 'o', 'o'], ['o', '_', 'o', 'o', 'o'], ['o', 'o', '_', 'o', 'o']]
когда я бы вместо этого хотел, чтобы он возвращался:
[['o', 'o', 'o', 'o', 'o'],
['o', 'o', 'X', 'o', 'o'],
['o', 'o', 'o', 'o', 'o'],
['o', '_', 'o', 'o', 'o'],
['o', 'o', '_', 'o', 'o']]
Вот код, который у меня есть до сих пор:
def create_box(box):
for i in box:
line = []
for j in box:
letters = []
for k in j:
if k != " ":
letters.append(k)
line.append(letters)
output = "n".join(str(line))
return line
Входное значение взято из текстового файла. Это:
o o o o o
o o X o o
o o o o o
o _ o o o
o o _ o o
Как бы мне добавить новую строку между подсписками?
Комментарии:
1. Внутри вашей функции вы выполняете кучу работы по созданию строки с именем
output
, в которой есть несколько новых строк, но затем выreturn battleship_line
, которая, по-видимому, является глобальной переменной (поскольку в функции нет другого кода, который с ней работает). Это то, что вы хотели, чтобы произошло?2. Почему вы повторяете
box
дважды?3. Значит, вы только не хотите печатать этот список по-другому?
4. Да, я хочу распечатать список списков из входного значения. С новыми строками между каждым вложенным списком.
5. Это странное использование
line
переменной… Для каждого элементаbox
вы восстанавливаете список… Вы могли бы выполнить 1 цикл при объявленииline
вне цикла и удалить двойной цикл… Кроме того, соединение не является списком, во время вызоваoutput = "n".join(str(line))
вы создаете строковую переменную, отчасти поэтому она печатается таким образом
Ответ №1:
В Python есть встроенный модуль с именем pprint
(для pretty-print), который делает подобные вещи «из коробки»:
import pprint
s = [['o', 'o', 'o', 'o', 'o'], ['o', 'o', 'X', 'o', 'o'], ['o', 'o', 'o', 'o', 'o'], ['o', '_', 'o', 'o', 'o'], ['o', 'o', '_', 'o', 'o']]
pp = pprint.PrettyPrinter()
pp.pprint(s)
Результат:
[['o', 'o', 'o', 'o', 'o'],
['o', 'o', 'X', 'o', 'o'],
['o', 'o', 'o', 'o', 'o'],
['o', '_', 'o', 'o', 'o'],
['o', 'o', '_', 'o', 'o']]
Редактировать на основе требований
Чтобы сделать что-то подобное вручную, вы можете join
использовать строковые представления списков с запятой и новой строкой (и пробелом, чтобы выровнять их). Вам нужно будет добавить внешние скобки вручную. Важной частью является вызов str()
каждого подсписка для получения строки из списка:
s = [['o', 'o', 'o', 'o', 'o'], ['o', 'o', 'X', 'o', 'o'], ['o', 'o', 'o', 'o', 'o'], ['o', '_', 'o', 'o', 'o'], ['o', 'o', '_', 'o', 'o']]
print('[' ',n '.join(str(sub) for sub in s) ']')
В результате:
[['o', 'o', 'o', 'o', 'o'],
['o', 'o', 'X', 'o', 'o'],
['o', 'o', 'o', 'o', 'o'],
['o', '_', 'o', 'o', 'o'],
['o', 'o', '_', 'o', 'o']]
Комментарии:
1. Это очень полезно. Можно ли было бы реализовать это вручную? Я пытаюсь избежать импорта чего-либо.
2. @AnthonyPetruzzio с уважением, избегать импорта вещей, которые являются частью стандартной библиотеки, — не лучшее использование python. То, что он импортирован, не означает, что это не Python. В библиотеку вложено множество полезных инструментов, и нет смысла изобретать их заново. Такие вещи, как
itertools
иcollections
и, в значительной степени являются частью базового python, но вам нужно импортировать их, чтобы использовать их.3. Я понимаю, и я согласен. Я бы использовал импорт, но это для назначения, и нам дали инструкции сделать это вручную. Спасибо за вашу помощь, хотя я ценю это!
4. @AnthonyPetruzzio понял. Возможно, редактирование укажет вам полезное направление.
Ответ №2:
Вот еще один способ сделать это:
output = "["
for sublist in list:
output = str(sublist) ',n '
print(output[:-3] ']')
сначала соберите все подсписки output
и ,n
соедините их, а затем распечатайте, удалив из него последние 3 символа ( ','
, 'n'
, ' '
) и добавив ]