print
可以很好地解开元组并删除括号和逗号,例如
a = (0, -1, 1)
print(*a)
生成0 -1 1
。使用 f 字符串尝试相同操作失败:
print(f'{*a}')
我发现的最接近的 f 字符串选项是:
print(f'{*a,}'.replace(',', '').replace('(', '').replace(')', ''))
有没有更直接的方法可以0 -1 1
使用*a
f 字符串?
7
最佳答案
3
不,f 字符串在这里没有用。
|
我能想到的最直接的方法是字符串的方法。
>>> a = ('x','y','z')
>>> print(f'{" ".join(a)}')
x y z
如果元组元素不是字符串,则必须转换它们(如果可能的话)。
>>> a = (0,-1,1)
>>> print(f'{" ".join(map(str, a))}')
0 -1 1
4
-
2@Paul – 我觉得把它放入 f 字符串中没有任何效果。至少在这个例子中。
print(" ".join(map(str, a))
更简洁,甚至print(*a)
更多。F 字符串很酷,但你不需要将它们用于一切。
–
-
如果有人想在程序中重复使用这一点,并且需要能够在 f 字符串中执行此操作以与其他 f 字符串格式的文本相结合,那么最好创建一个只返回的函数
" ".join(map(str, a))
,然后调用print(f"{unpack(a)}")
– -
@StephenC 我实际上关心的是获取一个字符串,该字符串随后将用于文件名。打印只是简化了我的帖子。
– -
嗯…
my_string = " ".join(map(str, a))
比更简单my_string = f'{" ".join(map(str, a))}'
。 f 字符串语法在这里没有任何价值。 (现在,如果您尝试一次性构造文件名或路径名,那么会有一些价值,但这不是您描述的用例所做的。)
–
|
问题是,星号(*)无法在打印函数中删除冒号和括号。
星号是一种将列表或元组视为列表或元组的方法。但将其中的每个元素视为您调用的函数的单个定位参数。
这意味着print(*a)
与 相同print(a[0], a[1], a[2])
。并且 print 具有用单个空格分隔每个给定参数的功能。
所以,f 字符串没有参数解包功能。因此,您必须采用连接可迭代对象的常规方法:
from functools import reduce
reduce(lambda left, right: f"{left} {right}", a)
Reduce 将迭代元素,并在第一次迭代中将元素 0 和 1 提供给 lambda,在第二次迭代中将第一次迭代的结果和元素 2 提供给 lambda,依此类推。这样会创建许多字符串,但您可以使用 f 字符串。如果您想使用它们。
或者一个快捷方式(从 trincot 的评论中偷来的)" ".join(map(str, a))
这里我们使用字符串的内置连接方法。这会连接字符串的可迭代对象,因此我们必须首先将 a 转换为字符串的可迭代对象,这就是 map 所做的,而不会更改 a 的值。
第三种方法是使用以 io.StringIo 为目标的 print,但这不会使用 f 字符串,但这里有一个示例链接:
|
f"{" ".join(map(str, a))}"
您所寻找的吗?–
*a
并将值作为单独的参数传递就可以了,正如您所演示的那样。您可以解包元组并以任何您喜欢的方式使用它,包括将其传递给执行其他格式的某个函数 – 但您希望应用什么格式?(请注意,这(<value>, ...)
是元组的正常表示,因此 f 字符串使用它很有意义)–
print
与解包无关。您始终可以使用解包元组*
,其用途之一是将其解包为函数的参数,就像print()
您在此处所做的那样。–
print
不会删除逗号和括号。这些只是将元组转换为字符串时生成的字符。但是当您传递它时*a
,print
不会看到元组,而是将其成员作为单独的参数获取。不涉及逗号或括号。–
–
|