Избежать строки внутри функции форматирования - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь использовать \ n внутри функции форматирования в python, поскольку это невозможно сделать с помощью fstrings.Но я не уверен, как это сделать.

raw_data = {'post 1': 'link 1', 'post 2': 'link 2'}

data = [("Post:{}\nLink: {}").format(title, link) for title, link in raw_data.items()]

print(data)

Что печатает: ['Post:post 1\nLink: link 1\n', 'Post:post 2\nLink: link 2\n']

Ожидаемый результат:

Сообщение: сообщение 1

Ссылка: ссылка 1

Сообщение: пост 2

Ссылка: ссылка 2

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Чтобы использовать return отформатированный список, мне пришлось преобразовать этот список в строку. Итак, я сделал:

raw_data = {'post 1': 'link 1', 'post 2': 'link 2'}

data = [("Post:{}\nLink: {}").format(title, link) for title, link in raw_data.items()]
return ''.join(data)
0 голосов
/ 24 марта 2019

Вы получаете это:

>>> raw_data = {'post 1': 'link 1', 'post 2': 'link 2'}
>>> data = [("Post:{}\nLink: {}").format(title, link) for title, link in raw_data.items()]
>>> print(data)
['Post:post 1\nLink: link 1', 'Post:post 2\nLink: link 2']

Это не то, что вы ожидали, но это обычный вывод Python. См. Документ :

Все аргументы, не являющиеся ключевыми словами, преобразуются в строки, как это делает str (), и записываются в поток

Давайте попробуем:

>>> str(data)
"['Post:post 1\\nLink: link 1', 'Post:post 2\\nLink: link 2']"

Обратите внимание на двойные кавычки вокруг результата и двойную обратную косую черту: str(data) - это строка, представляющая список, а print печатает эту строку ... а не ее содержимое. Это очень отличается от:

>>> for s in data: print(s)
...
Post:post 1
Link: link 1
Post:post 2
Link: link 2

Чтобы сосредоточиться на разнице, взгляните на одну строку:

>>> s = "a\nb"
>>> s # the value of the string s
'a\nb'
>>> print(s) # outputs the string s
a
b

Подводя итог: печать элементов списка отличается от печати самого списка. Используйте for s in data: print(s), чтобы получить то, что вы хотите.

РЕДАКТИРОВАТЬ если вы хотите вернуть печатный результат из функции, вы должны создать свою собственную строку, то есть data[0]+"\n"+data[1], или с join:

>>> s = "\n".join(data) 
>>> s # return this string
'Post:post 1\nLink: link 1\nPost:post 2\nLink: link 2'
>>> print(s)
Post:post 1
Link: link 1
Post:post 2
Link: link 2
...