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

Python 如何将多个整数列表转换为单个整数?,python,python-3.x,list,integer,Python,Python 3.x,List,Integer,如何在Python 3.5中转换列表,例如: x=[1, 3, 5] 将其转换为135?的整数(int)如果您有一个ints列表,并且希望将它们连接在一起,则可以使用将它们转换为字符串,将它们连接到空字符串上,然后使用返回到ints 在代码中,如下所示: r = int("".join(map(str, x))) 而r现在的通缉值为135 当然,这是一种有条件的有限方法。它要求所讨论的列表只包含正数ints(如示例所示)或表示ints的字符串,否则转换为字符串的步骤可能会失败,或者(负数)的

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

x=[1, 3, 5]

将其转换为
135

的整数(int)如果您有一个
int
s列表,并且希望将它们连接在一起,则可以使用将它们转换为字符串,
将它们连接到空字符串上,然后使用返回到
int
s

在代码中,如下所示:

r = int("".join(map(str, x)))
r
现在的通缉值为
135


当然,这是一种有条件的有限方法。它要求所讨论的列表只包含正数
int
s(如示例所示)或表示
int
s的字符串,否则转换为字符串的步骤可能会失败,或者(负数)的连接会很笨拙

这里有一种更为数学化的方法,不必来回转换为字符串。请注意,仅当0仅使用数学(不与字符串进行转换)时,它才起作用,您可以使用
reduce
函数(
functools.reduce
在Python 3中)

这利用了霍纳法则,该法则将表示数字的多项式因子化,以减少乘法次数。比如说,

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

如果您不喜欢map,您可以始终使用列表:

s = [str(i) for i in x]
r = int("".join(s))
转换整数列表的另一种方法。 产生输出:

135
Duration: 0:00:00.000105

[Program finished]

@LoïcFaure Lacroix OP特别询问了一系列integers@brianpck是的,我知道,但通用有时总比不通用好。顺便说一句,timeit测试是测试事物的好方法。答案并没有说reduce方法会随着大数字而变得更糟。使用较小的数字很好,但一旦它得到长度约为30个数字的数字,str版本将是最快的解决方案。@LoïcFaure Lacroix很好,我用较大的列表测试了两个数字解决方案,但没有字符串转换解决方案。(我很好奇用户定义函数的开销是否会减少,但我猜线性函数调用数还是比二次乘法数好。)我想解释为什么数学方法在处理大数时会变得更糟,是因为添加大数比一次性将字符串转换为大数更难。问题是,从技术上讲,字符串可以直接将str转换为一个大的数字。不确定它们是如何存储在python中的,但我看到了一些将大量数字存储为字符串的BigNumber库。。。但添加大数字需要更多的算术运算,因为数字不能完全存储在内存中。竖起大拇指!这是一个相当完整的答案!除非用于密码学,否则您的解决方案可能是使用整数和“真实”世界数的最佳解决方案。这比用数字计算值要慢,但其优点是基数大于10。@chepner使用大数字时速度更快,而使用较小的数时,您的版本通常更快(在我的电脑上为30位及以下)。值得注意的是,如果第一个整数为0,则此版本将失败。@asmuer解决方案并不意味着解决所有可能的输入,只是提供了一个OP。实际上,我没有看到一开始的
0
如何使其失败(转换字符串时,
int
调用将删除字符串中的任何前导零)。@asmurer
int
不尝试从字符串文字推断基数;除非可选的第二个参数另有规定,否则它使用基数10。标题仅表示“整数”对于列表元素。例如,
[-3,14,0,-163]
,应该返回哪个值?但是您的描述没有说明该列表无效,也没有说明文字(列表元素不能是变量?),也没有说明基数10。(并且它说输出应该是单个整数,而不是“无效文字”。)…如果您喜欢列表理解,您可以始终使用生成器表达式,并避免其中一个循环:
int(“.”join(str(i)表示x中的i))
如果您希望它更高效,是否最好使用
reversed(x)
而不是
x[:-1]
?后者必须创建一个全新的列表,但前者只是一个生成器。
s = [str(i) for i in x]
r = int("".join(s))
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]