Python .join() 可迭代字符串

Or *_*imi 2 python string iterable

我正在尝试找到一种简单的方法来将点.作为字符串 ( '43434' -> '43.434) 添加到每个 3 位数字上,并且我发现了 join 在此任务中的一个有趣用法:

num = '1234567'
new_num = '.'.join(num[i:i+3] for i in range(0, len(num), 3))
# new_num = 123.456.7'
Run Code Online (Sandbox Code Playgroud)

嗯,它接近我想要的。这就是我要的:

(its need to be `'1.234.567'`)
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?当我在连接上使用切片时,它会为每个项目添加附加内容:

num = '2333'
>>> '.'.join(num[0:2])
<<< '2.3'
>>> '.'.join(num[0:3])
<<< '2.3.3'
Run Code Online (Sandbox Code Playgroud)

我在某处读到它被称为字符串作为可迭代的概念。有人可以帮我理解吗?

Jar*_*red 5

可能的方式,

>>> num = '1234567'
>>> '.'.join([num[i-3 if i-3 > 0 else 0:i] for i in range(len(num),-1,-3)][::-1])
'1.234.567'
Run Code Online (Sandbox Code Playgroud)

一个基准,

$ python -mtimeit -s'num="1234567"' '".".join(num[::-1][i:i+3] for i in range(0, len(num), 3))[::-1]'
100000 loops, best of 3: 4.15 usec per loop

$ python -mtimeit -s'num="1234567"' '".".join([num[i-3 if i-3 > 0 else 0:i] for i in range(len(num), -1, -3)][::-1])'
1000000 loops, best of 3: 1.87 usec per loop
Run Code Online (Sandbox Code Playgroud)

对我来说,这两个方案都不那么清晰,但如果您更喜欢第一个(发布的流行解决方案),它只是稍微慢一些。