python 怎么把元组转换成数字_Python将元组转换为整数

当把它转换成一个字符串然后再转换成一个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方法比较粗糙,读者不太清楚,这通常是优先于速度的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值