有两种方法可以回答这个问题:
A.通过将 [] 替换为 {} 来修改 str(alist)。 @Garret 修改了 str 结果调用 str.replace 两次。另一种方法是使用 str.translate 同时进行这两项更改。第三种,也是我发现的最快的方法,是切掉 [ 和 ],保留内容,然后添加 { 和 }。
B.计算 str(alist)[1:-1] 计算的内容,但使用 Python 代码并将结果嵌入 {...} 中。使用 CPython,为构建内容字符串而提出的多个替换要慢得多:
import timeit
expressions = ( # Orderd by timing results, fastest first.
"'{' + str(alist)[1:-1] + '}'",
"str(alist).replace('[','{').replace(']','}')",
"str(alist).translate(table)",
"'{' + ', '.join(map(str, alist)) + '}'",
"'{{{}}}'.format(', '.join(map(str, alist)))",
"'{' + ', '.join(str(c) for c in alist) + '}'",
)
alist = [1,2,3]
table = str.maketrans('[]', '{}')
for exp in expressions:
print(eval(exp)) # Visually verify that exp works correctly.
alist = [1]*100 # The number can be varied.
n =1000
for exp in expressions:
print(timeit.timeit(exp, number=n, globals=globals()))
在 Windows 10 上使用 64 位 3.7.0b2 的结果:
{1, 2, 3}
{1, 2, 3}
{1, 2, 3}
{1, 2, 3}
{1, 2, 3}
{1, 2, 3}
0.009153687000000021
0.009371952999999988
0.009818325999999988
0.018995990000000018
0.019342450999999983
0.028495214999999963
1000 和 10000 的相对结果大致相同。
编辑:@Mike Müller 独立发布了切片表达式,嵌入在以下两个表达式中,其时序与上面的顶部表达式基本相同。
"f'{{{str(alist)[1:-1]}}}'",
"'{%s}' % str(alist)[1:-1]",