42

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

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

这虽然有点麻烦,但使用 3.6 之前的 .format 表示法完成了这项工作。考虑到运行时字符串连接,新的 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 字符串中使用 \。我已经阅读了 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)

用尾随逗号解包。

4

5 回答 5

33

Just add a coma after the unpacked list.

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

There is a longer explanation to this syntax in this thread.

于 2020-06-05T23:54:57.253 回答
26

由于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'
于 2017-03-13T05:19:10.293 回答
1

简单的 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'
于 2017-09-26T04:54:02.413 回答
1

我不认为这是 f-Strings 的使用方式。充其量我可以想象准备一个 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
于 2019-01-13T15:08:46.500 回答
0

我不久前做了这个,包括逗号牛津风格。

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
于 2020-11-18T08:05:23.073 回答