如何使用换行符' ' 在 f 字符串中格式化字符串列表?

问题描述 投票:0回答:9

我尝试了这段代码:

names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)

但是,

'\'
不能在 f 字符串的
{...}
表达式部分内使用。我怎样才能让它发挥作用?结果应该是:

Winners are:
Adam
Bob
Cyril

参见 为什么不能在 f 字符串的大括号内使用反斜杠?我该如何解决这个问题?有关为什么存在限制的一些额外讨论。

python python-3.x newline f-string
9个回答
283
投票

Python 3.12+

您可以在 f 字符串中使用反斜杠,并且问题中的现有代码可以按预期工作。请参阅https://docs.python.org/3.12/whatsnew/3.12.html#pep-701-syntropic-formalization-of-f-strings

Python < 3.12

你不能。反斜杠不能出现在大括号内

{}
;这样做会产生
SyntaxError
:

>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash

这在 f 字符串的 PEP 中指定:

反斜杠不能出现在 f 字符串的表达式部分内,[...]

一个选项是将

'\n'
分配给名称,然后在
.join
字符串内分配
f
;也就是说,不使用文字:

names = ['Adam', 'Bob', 'Cyril']
nl = '\n'
text = f"Winners are:{nl}{nl.join(names)}"
print(text)

结果:

Winners are:
Adam
Bob
Cyril

@wim 指定的另一个选项是使用

chr(10)
来获取
\n
返回,然后加入那里。
f"Winners are:\n{chr(10).join(names)}"

当然,还有一个方法是预先

'\n'.join
,然后相应地添加名称:

n = "\n".join(names)
text = f"Winners are:\n{n}"

这会产生相同的输出。

注:

这是

f
字符串和
str.format
之间的细微差别之一。在后者中,您始终可以使用标点符号,前提是解压缩包含这些键的相应古怪字典:

>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"

(请不要这样做。)

在前者中,不允许使用标点符号,因为您不能拥有使用它们的标识符。


旁白:我肯定会选择

print
format
,正如其他答案所建议的那样。我给出的选项仅适用于您出于某种原因必须使用 f 字符串。

仅仅因为某些东西是新的,并不意味着您应该尝试用它做所有事情;-)


88
投票

您不需要 f 字符串或其他格式化程序来打印带有分隔符的字符串列表。只需使用

sep
关键字参数
print()
:

names = ['Adam', 'Bob', 'Cyril']
print('Winners are:', *names, sep='\n')

输出:

Winners are:
Adam
Bob
Cyril

也就是说,在这里使用

str.join()
/
str.format()
可以说比任何 f 字符串解决方法更简单、更具可读性:

print('\n'.join(['Winners are:', *names]))
print('Winners are:\n{}'.format('\n'.join(names)))

29
投票

您不能像其他人所说的那样在 f 字符串中使用反斜杠,但您可以使用

os.linesep
来解决这个问题(尽管请注意,这不会在所有平台上都是
\n
,并且不建议除非阅读/编写二进制文件;参见 Rick 评论):

>>> import os
>>> names = ['Adam', 'Bob', 'Cyril']
>>> print(f"Winners are:\n{os.linesep.join(names)}")
Winners are:
Adam
Bob
Cyril 

或者也许以一种不太可读的方式,但保证是

\n
,与
chr()

>>> print(f"Winners are:\n{chr(10).join(names)}")
Winners are:
Adam
Bob
Cyril

11
投票

其他答案给出了如何将换行符放入 f 字符串字段的想法。然而,我认为对于OP给出的示例(可能或可能不表明OP的实际用例),实际上不应该使用这些想法。

使用 f 字符串的全部目的是提高代码可读性。对于 f 弦,没有什么是

format
做不到的。仔细考虑是否有任何更具可读性(如果你能做到的话):

f"Winners are:\n{'\n'.join(names)}"

...或者这个:

newline = '\n'
f"Winners are:\n{newline.join(names)}"

...或者这个:

"Winners are:\n{chr(10).join(names)}"

对比这个:

"Winners are:\n{}".format('\n'.join(names))

最后一种方式至少具有同样的可读性,甚至更好。

简而言之:当你需要一把螺丝刀时,不要仅仅因为你有一把闪亮的新螺丝刀而使用锤子。代码的读取次数远多于编写次数。

对于其他用例,是的,

chr(10)
想法或
newline
想法可能是合适的。但不是给定的那个。


5
投票

在 Python 3.12+ 上,你可以

>>> names = ['Adam', 'Bob', 'Cyril']
>>> print(f"Winners are:\n{'\n'.join(names)}")
Winners are:
Adam
Bob
Cyril

您还可以在 f 字符串的表达式部分重复使用相同的引号:

>>> print(f"Winners are:\n{"\n".join(names)}")        
Winners are:
Adam
Bob
Cyril

详情请参阅PEP 701


4
投票
print(f'{"blah\n"}')

以上说法会引发

SyntaxError
, 但为了避免错误,您可以简单地分配包含以下内容的字符串 到一个变量并在 f 字符串中使用它。

x = "blah\n"
print(f'{x}')

2
投票

记住不要使用这种奇怪的方式也有效:

names = ['Adam', 'Bob', 'Cyril']
text = f"""{'''
'''.join(names)}"""
print(text)

1
投票

如果(且仅当!)可读性是重中之重,并且速度确实不是一个因素,那么即使有更简单的编程方法,f 字符串对于使简单的函数自记录非常有用。在以下情况下,f 字符串的可读性最大化:(1) 更改参数状态的语句非常明显,并且 (2) 当打印参数时,打印语句经过精心格式化,并以直观方式呈现,以使参数脱颖而出:

'''
function to print out an identification header, consisting
of the programmer supplied title, lastname, and firstname:
''' 
FORMAT_DATE = "%m-%d-%y %H:%M:%S"

date_and_time = datetime.now()
name_line = f"* {lastname}, {firstname}"
title_line = f"* {title}"
date_line = f"* {date_and_time.strftime(FORMAT_DATE)}"
print(name_line
    + '\n'
    + title_line
    + '\n'
    + date_line)

输出:

* Lovelace, Ada
* Bernoulli Numbers algorithm implemented in Python
* 10-28-42 20:13:22

-3
投票
# Using Python 3.12.5
names = ['Adam', 'Bob', 'Cyril']
# Convert list [...] to str '[...]', apply replace method to remove '[', ']' , convert ', ' to '\n' and remove single quotes

name = str(names).replace('[', '').replace(']', '').replace(', ', '\n').replace("'","") 

text = f"Winners are:\n{name}" 

#  \ is not present inside{}

print(text)

# if one step is to be reduced
text = f"Winners are:\n{str(names).replace('[', '').replace(']', '').replace(', ', '\n').replace("'","")}"
print(text)

#here, join method is not used.
© www.soinside.com 2019 - 2024. All rights reserved.