当把它转换成一个字符串然后再转换成一个int时,这是一个有点老套的方法。我们已经掌握了制作数字所需的所有信息,即:数字。
数字的位置。
由于我们有这些信息,我们可以通过计算每个位置的每个单元的值,然后将其乘以所述位置的数字来计算数字。然后我们把结果加起来,得到我们的号码。这可以在一行中完成,如下所示:test = (1, 2, 3)
sum((10**pos)*val for pos, val in enumerate(reversed(test)))
让我们把这个分解一下:>>> list(enumerate(reversed(test)))
[(0, 3), (1, 2), (2, 1)]
那么,如果我们把它乘起来:>>> list((10**pos)*val for pos, val in enumerate(reversed(test)))
[3, 20, 100]
所以我们求和得到123。
编辑:关于速度的说明:python -m timeit "int(''.join(map(str,(1,2,3))))"
100000 loops, best of 3: 2.7 usec per loop
python -m timeit 'sum((10**pos)*val for pos, val in enumerate(reversed((1,2,3))))'
100000 loops, best of 3: 2.29 usec per loop
python -m timeit -s 'from functools import reduce' 'reduce(lambda rst, d: rst * 10 + d, (1, 2, 3))'
1000000 loops, best of 3: 0.598 usec per loop
所以如果你在加速,Andrey Yazu's answer有它。我对自己认为更具可读性的东西感到心烦意乱。我总是觉得lambdas有点难看,但总的来说,我认为它仍然是更可读的方法。
编辑2:对于非常大的元组:
长度20:python -m timeit -s "x=tuple(list(range(1,10))*2)" "int(''.join(map(str, x)))"
100000 loops, best of 3: 5.45 usec per loop
python -m timeit -s "x=tuple(list(range(1,10))*2)" "sum((10**pos)*val for pos, val in enumerate(reversed(x)))"
100000 loops, best of 3: 11.7 usec per loop
python -m timeit -s "x=tuple(list(range(1,10))*2)" -s 'from functools import reduce' 'reduce(lambda rst, d: rst * 10 + d, x)'
100000 loops, best of 3: 4.18 usec per loop
长度100:python -m timeit -s "x=tuple(list(range(1,10))*10)" "int(''.join(map(str, x)))"
100000 loops, best of 3: 18.6 usec per loop
python -m timeit -s "x=tuple(list(range(1,10))*10)" "sum((10**pos)*val for pos, val in enumerate(reversed(x)))"
10000 loops, best of 3: 72.9 usec per loop
python -m timeit -s "x=tuple(list(range(1,10))*10)" -s 'from functools import reduce' 'reduce(lambda rst, d: rst * 10 + d, x)'
10000 loops, best of 3: 25.6 usec per loop
在这里,我们看到最快的方法实际上是字符串操作——然而,事实上,您不太可能在10位数的范围之外使用这个方法——在这个范围内,reduce()方法仍然控制着速度。我还认为string方法比较粗糙,读者不太清楚,这通常是优先于速度的。