print可以很好地解开元组并删除括号和逗号,例如

a = (0, -1, 1)
print(*a)

生成0 -1 1。使用 f 字符串尝试相同操作失败:

print(f'{*a}')

我发现的最接近的 f 字符串选项是:

print(f'{*a,}'.replace(',', '').replace('(', '').replace(')', ''))

有没有更直接的方法可以0 -1 1使用*af 字符串?

7

  • 1
    f"{" ".join(map(str, a))}"您所寻找的吗?


    – 

  • 1
    您到底想要实现什么?如果您想打印元组的所有值,只需解包*a并将值作为单独的参数传递就可以了,正如您所演示的那样。您可以解包元组并以任何您喜欢的方式使用它,包括将其传递给执行其他格式的某个函数 – 但您希望应用什么格式?(请注意,这(<value>, ...)是元组的正常表示,因此 f 字符串使用它很有意义)


    – 


  • 4
    请注意,这print与解包无关。您始终可以使用解包元组*,其用途之一是将其解包为函数的参数,就像print()您在此处所做的那样。


    – 


  • 2
    注意:print不会删除逗号和括号。这些只是将元组转换为字符串时生成的字符。但是当您传递它时*aprint不会看到元组,而是将其成员作为单独的参数获取。不涉及逗号或括号。


    – 

  • 1
    另请参阅:


    – 


最佳答案
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 字符串,但这里有一个示例链接: