如何将多个整数的列表转换为单个整数?

hom*_*ict 14 python int list python-3.x

如何在Python 3.5中转换列表,例如:

x=[1, 3, 5]
Run Code Online (Sandbox Code Playgroud)

135(整个int)的int?

bri*_*pck 30

这是一种更加数学化的方式,无需来回转换为字符串.请注意,它仅在0 <= i <= 9时有效.

>>> x = [1, 3, 5]
>>> sum(d * 10**i for i, d in enumerate(x[::-1]))
135
Run Code Online (Sandbox Code Playgroud)

我们的想法是将列表中的每个元素乘以其相应的10的幂,然后对结果求和.

  • 如果你想要它有效率,那么做"反向(x)"而不是"x [:: - 1]"会更好吗?后者必须创建一个全新的列表,但前者只是一个生成器. (3认同)

Jim*_*ard 27

如果你有一个ints 列表并且想要将它们连接在一起,你可以使用mapwith str将它们转换为字符串,将它们转换join为空字符串然后再转换为ints int.

在代码中,这看起来像这样:

r = int("".join(map(str, x)))
Run Code Online (Sandbox Code Playgroud)

r现在有想要的价值135.

当然,这是一种在某些条件下有限的方法.它要求有问题的列表除了正ints(作为你的样本)或代表ints的字符串之外什么都不包含,否则转换为字符串的步骤可能会失败或者(负)数字的加入将是笨重的.

  • @asmeurer解决方案并不是要解决所有可能的输入,只是提供的OP.我实际上没有看到开头的`0`会如何使它失败(`int`调用会在转换时从字符串中删除任何前导零). (2认同)

che*_*ner 23

仅使用数学(不转换为字符串或来自字符串),您可以使用该reduce函数(functools.reduce在Python 3中)

b = reduce(lambda total, d: 10*total + d, x, 0)
Run Code Online (Sandbox Code Playgroud)

这利用了Horner的规则,该规则将表示数字的多项式归因于减少乘法的次数.例如,

1357 = 1*10*10*10 + 3*10*10 + 5*10 + 7     # 6 multiplications
     = ((1*10 + 3)*10 + 5)*10 + 7          # 3 multiplications
Run Code Online (Sandbox Code Playgroud)

因此,这比计算10的幂或创建字符串并将结果转换为整数更快.

>>> timeit.timeit('reduce(lambda t,d: 10*t+d, x, 0)', 'from functools import reduce; x=[1,3,5,7]')
0.7217515400843695
>>> timeit.timeit('int("".join(map(str, [1,3,5,7])))')
1.425914661027491
>>> timeit.timeit('sum(d * 10**i for i, d in enumerate(x[::-1]))', 'x=[1,3,5,7]')
1.897974518011324
Run Code Online (Sandbox Code Playgroud)

公平地说,一旦数字变大,字符串转换就会更快.

>>> import timeit

# 30 digits
>>> setup='from functools import reduce; x=[5, 2, 6, 8, 4, 6, 6, 4, 8, 0, 3, 1, 7, 6, 8, 2, 9, 9, 9, 5, 4, 5, 5, 4, 3, 6, 9, 2, 2, 1]' 
>>> print(timeit.timeit('reduce(lambda t,d: 10*t+d, x, 0)', setup))
6.520374411018565
>>> print(timeit.timeit('int("".join(map(str, x)))', setup))
6.797425839002244
>>> print(timeit.timeit('sum(d * 10**i for i, d in enumerate(x[::-1]))', setup))
19.430233853985555

# 60 digits
>>> setup='from functools import reduce; x=2*[5, 2, 6, 8, 4, 6, 6, 4, 8, 0, 3, 1, 7, 6, 8, 2, 9, 9, 9, 5, 4, 5, 5, 4, 3, 6, 9, 2, 2, 1]' 
>>> print(timeit.timeit('reduce(lambda t,d: 10*t+d, x, 0)', setup))
13.648188541992567
>>> print(timeit.timeit('int("".join(map(str, x)))', setup))
12.864593736943789
>>> print(timeit.timeit('sum(d * 10**i for i, d in enumerate(x[::-1]))', setup))
44.141602706047706

# 120 digits!
>>> setup='from functools import reduce; x=4*[5, 2, 6, 8, 4, 6, 6, 4, 8, 0, 3, 1, 7, 6, 8, 2, 9, 9, 9, 5, 4, 5, 5, 4, 3, 6, 9, 2, 2, 1]' 
>>> print(timeit.timeit('reduce(lambda t,d: 10*t+d, x, 0)', setup))
28.364255172084086
>>> print(timeit.timeit('int("".join(map(str, x)))', setup))
25.184791765059344
>>> print(timeit.timeit('sum(d * 10**i for i, d in enumerate(x[::-1]))', setup))
99.88558598596137
Run Code Online (Sandbox Code Playgroud)

  • 竖起大拇指!这是一个非常完整的答案!除非用于加密,否则您的解决方案可能是具有整数和"真实"世界数字的最佳解决方案. (2认同)