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

新手上路,请多包涵

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

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

这虽然有点麻烦,但可以使用 pre-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)

使用尾随逗号解包。

原文由 NaN 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 451
2 个回答

只需在解包列表后添加一个逗号即可。

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

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

原文由 SenhorLucas 发布,翻译遵循 CC BY-SA 4.0 许可协议

由于在 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'

如果您的实际用例使上述内容比您想要的更冗长,您当然也可以编写一个辅助函数:

 def unpack(s):
    return " ".join(map(str, s))  # map(), just for kicks

 >>> f'unpack a list: {unpack(a)}'
'unpack a list: 1 a 3 b'

原文由 Zero Piraeus 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题