python-3.x f字符串语法用于解包一个包含大括号抑制的列表

ubby3x7f  于 2023-06-25  发布在  Python
关注(0)|答案(5)|浏览(130)

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

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

这虽然有点麻烦,但使用3.6之前的格式表示法来完成这项工作。新的f字符串格式选项在给定运行时字符串连接时很有趣。我遇到问题的是{}的数量的复制。在我前面的示例中,我只是创建了必要的结构并在. 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字符串中使用\。我已经阅读了人教和广泛搜索,然而,我觉得我错过了明显的或我希望的是目前不可能的。
几个小时后编辑:

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)

用逗号解包。

arknldoa

arknldoa1#

最短解

只需在未打包的列表后面添加逗号即可。

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

对于这个语法in this thread还有更长的解释。

注意事项

使用这种解决方案的原因是,我们对输出格式没有太多的控制。我们被format返回的结果卡住了,这实际上是tuple.__repr__的结果(令人惊讶的是)。所以我们得到的括号可能是误导的,因为我们实际上有一个列表,而不是元组。
如果这太糟糕而无法忍受,我建议使用approach suggested by Zero Piraeus

>>> a = [1, 2, 3]
>>> print(f'Unpacked list: {" ".join(str(i) for i in a)}')

这使我们可以灵活地按照我们的意愿编排清单。

htrmnn0y

htrmnn0y2#

由于任何有效的Python表达式都允许在f字符串的大括号内,因此您可以简单地使用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'

当然,你也可以写一个helper函数,如果你的真实用例使上面的代码比你想的更冗长:

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'
xt0899hw

xt0899hw3#

简单的Python可能更清楚:

>>>  'unpack a list: ' + ' '.join(str(x) for x in a)
'unpack a list: 1 a 3 b'

切片:

>>> 'unpack a list: ' + ' '.join([str(x) for x in a][1:3])
'unpack a list: a 3'
t30tvxxf

t30tvxxf4#

我不认为这是f字符串应该使用的方式。我最多可以想象准备一个print()兼容的元组,比如:

mixed = [1, "list_string", 2]
number = 23
answer = 46

info = 'Content:', *mixed, f'{number} {answer}'
print(*info)  # default sep=' '

输出量

Content: 1 list_string 2 23 46
vsdwdz23

vsdwdz235#

我做了一段时间,包括逗号牛津风格。

def unpack_list(lst):  # Oxford comma
    if not isinstance(lst, str):
        lst = [str(item) for item in lst]
    if len(lst) == 0:
        return
    if len(lst) == 1:
        return ", ".join(lst)
    if len(lst) == 2:
        return ", and ".join(lst) 
    else:
        first_part = lst[:-1]
        last_part = lst[-1]
        return ", ".join(first_part) + ", and " + last_part

相关问题