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

时间:2016-12-09 20:00:15

标签: python list python-3.x int

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

r_file.txt

x=[1, 3, 5] 的int(整个int)?

5 个答案:

答案 0 :(得分:30)

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

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

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

答案 1 :(得分:27)

如果您有$ oc explain is.spec.tags.importPolicy RESOURCE: importPolicy <Object> DESCRIPTION: Import is information that controls how images may be imported by the server. TagImportPolicy describes the tag import policy FIELDS: insecure <boolean> Insecure is true if the server may bypass certificate verification or connect directly over HTTP during image import. scheduled <boolean> Scheduled indicates to the server that this tag should be periodically checked to ensure it is up to date, and imported 的列表并且想要将它们加在一起,则可以mapstr一起使用,将它们转换为字符串,int将它们转换为字符串空字符串,然后使用int强制转换回join

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

int

r = int("".join(map(str, x))) 现在的所需值为r

当然,这是一种有限的方法,有些条件。它要求有问题的列表除了正135 s(作为您的样本)或表示int的字符串之外不包含任何其他内容,否则转换为字符串的步骤可能会失败或加入(否定)数字会很笨重的。

答案 2 :(得分:23)

仅使用数学(不与字符串进行转换),您可以使用reduce函数(Python 3中的functools.reduce

b = reduce(lambda total, d: 10*total + d, x, 0)

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

1357 = 1*10*10*10 + 3*10*10 + 5*10 + 7     # 6 multiplications
     = ((1*10 + 3)*10 + 5)*10 + 7          # 3 multiplications

因此,这比计算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

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

>>> 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

答案 3 :(得分:1)

如果你不喜欢地图,你总是可以使用列表理解:

s = [str(i) for i in x]
r = int("".join(s))

答案 4 :(得分:0)

import time
from datetime import timedelta


start_time = time.monotonic()

x=[1, 3, 5]
y =""
for i in x:
    y += str(i)
print(int(y))

end_time = time.monotonic()
print(f'Duration: {timedelta(seconds=end_time - start_time)}')

另一种转换整数列表的方法。 产生输出:

135
Duration: 0:00:00.000105

[Program finished]