用于解压缩具有大括号抑制的列表的f-string语法

NaN*_*NaN 13 python string-formatting python-3.x python-3.6 f-string

我一直在使用新的f-string格式检查我的一些字符串格式选项.我经常需要解压缩列表和其他未知长度的迭代.目前我使用以下...

>>> a = [1, 'a', 3, 'b']
>>> ("unpack a list: " + " {} "*len(a)).format(*a)
'unpack a list:  1  a  3  b '
Run Code Online (Sandbox Code Playgroud)

这虽然有点麻烦,但使用3.6之前的格式表示法.考虑到运行时字符串连接,新的f-string格式选项很有意思.这是我遇到问题的{}数量的复制.在我之前的例子中,我只是创建了必要的结构并在.format()部分中解压缩.

尝试这样做产生了一个有效的变体,但是,我不能将两个花括号放在一起,或者它不能解包...

(1)

>>> 'unpack a list'  f' {{*a}}'
'unpack a list {*a}'
Run Code Online (Sandbox Code Playgroud)

按下,我在内部{}对周围插入了一个空格.这是一个适度的改进,但是开始和结束{,}存在.

(2)

>>> 'unpack a list'  f' { {*a} }'
"unpack a list {1, 3, 'a', 'b'}"
Run Code Online (Sandbox Code Playgroud)

将变体拼接成一个封闭的f-string使外观和语法更好,因为评估显然是从左到右.然而,这仍然留下了封闭的花括号.

(3)

>>> f'unpack a list { {*a} }'
"unpack a list {1, 3, 'a', 'b'}"
Run Code Online (Sandbox Code Playgroud)

也许,我正在过度思考整个过程,并希望采用某种形式的自动拆包.这只是产生了列表表示,大括号被[]替换.
(4)

>>> f'unpack a list {a}'
"unpack a list [1, 'a', 3, 'b']"
Run Code Online (Sandbox Code Playgroud)

在上面的变体(3)中抑制大括号需要什么,或者我已经辞职继续使用我习惯的.format()选项.我想保持简单并使用f-string提供的新功能,而不是回溯到我目前所熟悉的python版本之外.我开始怀疑f'strings'不能完全覆盖其.format()兄弟所提供的内容.我现在就把它留在那里,因为我甚至没有冒险进入转义编码和无法在f字符串中使用\.我已经阅读了PEP并广泛搜索,但是,我觉得我错过了明显的或我希望的目前是不可能的.

几个小时后编辑

我确实找到了这个变种,它将用于我需要的一些情况

f'unpack a list: {str(a)[1:-2]}'
"unpack a list: 1, 'a', 3, 'b"
Run Code Online (Sandbox Code Playgroud)

但切片只是一个方便,仍然在结果周围留下字符串引号.

Sen*_*cas 22

只需在解包列表后添加一个昏迷。

a = [1, 2, 3]
print(f"Unpacked list: {*a,}")
Run Code Online (Sandbox Code Playgroud)

在此线程中对此语法有更长的解释。

  • 有没有办法省略括号? (6认同)
  • 为什么选择这个答案?`print(f"Unpacked list: {*a,}")` 实际上将列表转换为元组,不幸的是没有删除大括号,它用括号替换它们并生成 `Unpacked list: (1, 2, 3) `。是否有解决方案实际删除大括号,比这个[实际答案](/sf/answers/2992995211/)短? (4认同)
  • 您好,快速问一下,我将如何“舍入”列表的元素?{*list,:.2f} 似乎不起作用。 (3认同)
  • 这样就完成了,缺少的逗号。谢谢 (2认同)
  • 读者请注意:“print(*foo)”不会产生与“print(f'{*foo,}')”相同的输出,也不应该。请参阅链接了解更多信息。 (2认同)

Zer*_*eus 15

由于f字符串中的大括号内允许使用任何有效的Python表达式,因此您只需使用它str.join()来生成所需的结果:

>>> a = [1, 'a', 3, 'b']
>>> f'unpack a list: {" ".join(str(x) for x in a)}'
'unpack a list: 1 a 3 b'
Run Code Online (Sandbox Code Playgroud)

你当然也可以编写一个帮助函数,如果你的真实世界用例使上面的内容比你想要的更冗长:

def unpack(s):
    return " ".join(map(str, s))  # map(), just for kicks
Run Code Online (Sandbox Code Playgroud)

>>> f'unpack a list: {unpack(a)}'
'unpack a list: 1 a 3 b'
Run Code Online (Sandbox Code Playgroud)

  • 很抱歉听到这个......你确定你不仅仅是对f字符串允许你思考这个问题的方式发生意外变化做出消极反应吗?对我来说,你必须跳过来构建你的`format`字符串的箍使得它的可读性远远低于这里提供的f-string替代方案 - 它使用了一种非常常见的Python习惯用法,对于任何阅读它的人来说都很明显,IMO. (3认同)
  • @Zero_Piraeus但是,感谢您的建议,点格式的实现仍然更加不便。 (2认同)
  • 假设a = [1、2、3、4],如果要使用一种特定格式,则可以对列表进行解压缩:“ +”“ .join(f” {x:0.2f}“ for x在a)`中,但我同意@NaN并不优雅。像`f“这样的语法将列表解包会很好:{* a:0.2f}”`为所有列表元素重复格式。我肯定我想念为什么无法实现这样的原因... (2认同)