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

标签 python python-3.x string-formatting python-3.6 f-string

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

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

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

尝试这样做产生了一种有效的变体,但是:

1) 两个花括号在一起不会解包...

>>> 'unpack a list'  f' {{*a}}'
'unpack a list {*a}'

2) 在内部 {} 对周围添加空格:

这有效,但留下左大括号和右大括号 {, }:

>>> 'unpack a list'  f' { {*a} }'
"unpack a list {1, 3, 'a', 'b'}"

2b) 将变体连接成一个 f 字符串

这使外观和语法变得更好,因为评估显然是从左到右进行的。然而,这仍然留下了封闭的大括号:

>>> f'unpack a list { {*a} }'
"unpack a list {1, 3, 'a', 'b'}"

3) 尝试使用 {a}

自动解包

也许,我对整个过程想得太多了,希望有某种形式的自动解包。这简单地产生了列表表示,其中大括号被替换为 [] :

>>> f'unpack a list {a}'
"unpack a list [1, 'a', 3, 'b']"

需要什么来抑制上面变体 (2) 中的大括号,或者我必须继续使用现有的 .format() 方法?我想保持简单并使用 f-string 提供的新功能,而不是恢复到早于我目前熟悉的 python 版本。我开始怀疑 f'strings' 没有完全涵盖其 .format() 兄弟所提供的内容。我暂时将它留在那儿,因为我什至还没有尝试过转义编码和无法在 f 字符串中使用\。我已经阅读了 PEP 并进行了广泛的搜索,但是,我觉得我遗漏了明显的东西,或者我想要的东西目前是不可能的。

几个小时后编辑:

4) 使用下标手动切掉括号:str(a)[1:-2]

我确实找到了这个变体,它可以用于我需要的某些情况

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

但切片只是为了方便,仍然在结果周围留下字符串引号。

5) 和来自@SenhorLucas 的最终解决方案

 a = np.arange(10)

print(f"{*a,}")
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

用逗号解包。

最佳答案

在解压后的列表后面加一个逗号就可以了。

a = [1, 2, 3]
print(f"Unpacked list: {*a,}")
# Unpacked list: (1, 2, 3)

这个语法有更长的解释 in this thread .

关于python - 用于解压缩带有大括号抑制的列表的 f-string 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42756537/

相关文章:

python - Flask-WTF 使用 input=submit 而不是 button type=submit

python - 如何处理在 FastAPI 中混淆的路径操作?

python - 在python中增加多行的某些列

string - ZipFile 中的 namelist() 返回编码无效的字符串

python - 按类的属性分组和计数

c++ - 为什么使用 2 位小数精度格式化的 0.125 显示 "0.12"而不是 "0.13"?

c# - 格式十进制 c# - 保留最后一个零

python - music21:如何同时将和弦附加到流中?

c# - 带自定义格式化程序的 String.Format

python - python有数量限制吗?