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

Posted

技术标签:

【中文标题】如何将多个整数的列表转换为单个整数?【英文标题】:How to convert a list of multiple integers into a single integer? 【发布时间】:2017-04-25 09:03:24 【问题描述】:

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

x=[1, 3, 5]

135的整数(int)?

【问题讨论】:

标题只是表示列表元素的“整数”。例如,[-3,14,0,-163],应该返回哪个值? 但是您的描述没有说明该列表无效,也没有说明文字(列表元素不能是变量?),也没有说明以 10 为底。(它确实说输出应该是单个整数,而不是“无效的文字”。) 【参考方案1】:

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

在代码中,如下所示:

r = int("".join(map(str, x)))

r 现在的通缉值是135

当然,这是一种有限的方法,需要满足一些条件。它要求有问题的列表只包含正数ints(作为您的示例)或代表ints 的字符串,否则转换为字符串的步骤可能会失败,或者(负数)数字的连接会很笨拙。

【讨论】:

这比数值计算要慢,但有利于处理大于 10 的碱基。 @chepner 大数字会更快,而您的版本通常会更快,小数字(我的电脑上 30 位或更少)。 值得注意的是,如果第一个整数是0,这个版本会失败。 @asmeurer 该解决方案并非旨在解决所有可能的输入,而只是提供一个 OP。我实际上没有看到一开始的 0 会如何使其失败(int 调用将在转换字符串时从字符串中删除任何前导零)。 @asmeurer int 不会尝试从字符串文字推断基数;除非可选的第二个参数另有说明,否则它使用基数 10。【参考方案2】:

这是一种更数学的方式,不必来回转换为字符串。请注意,它仅在 0

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

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

【讨论】:

如果您希望它高效,使用reversed(x) 而不是x[::-1] 会更好吗?后者必须创建一个全新的列表,但前者只是一个生成器。【参考方案3】:

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

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

这利用了霍纳规则,该规则将表示数字的多项式分解以减少乘法次数。例如,

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

【讨论】:

@LoïcFaure-Lacroix OP 专门询问整数数组 @brianpck 是的,我知道,但通用有时总比没有好。顺便说一句,timeit 测试是测试事物的好方法。答案并没有说 reduce 方法会因大数字而变得更糟。较小的数字很好,但一旦获得长度约为 30 个数字的数字,str 版本将是最快的解决方案。 @LoïcFaure-Lacroix 好点,我用更大的列表测试了两个数字解决方案,但没有测试字符串转换一个。 (我很好奇用户定义函数的开销是否会丢失,但我猜函数调用的线性数量仍然比乘法的二次数量要好。) 我猜想解释为什么数学方法在处理大数时会变得更糟,因为添加大数比将字符串转换为大数一次更难。问题是字符串在技术上可以直接将 str 转换为一个大数。不知道它们是如何存储在 python 中的,但我见过几个 BigNumber 库将大数字存储为字符串......但是添加大数字需要更多的算术运算,因为数字不能完全存储在内存中。 点赞!这是一个非常完整的答案!除非用于加密,否则您的解决方案可能是具有整数和“真实”世界数字的最佳解决方案。【参考方案4】:

如果您不喜欢地图,您可以随时使用列表推导:

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

【讨论】:

...如果您喜欢列表推导,您可以随时使用生成器表达式,并避免其中一个循环:int("".join(str(i) for i in x))【参考方案5】:
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]

【讨论】:

以上是关于如何将多个整数的列表转换为单个整数?的主要内容,如果未能解决你的问题,请参考以下文章

将每行从整数列表转换为整数数组?

如何使用 AutoMapper 将对象列表转换为整数列表?

将字符串列表转换为整数列表[重复]

在java中将整数列表转换为整数数组[重复]

如何将字符串数字转换为列表中的整数?

如何将字符串中的多个数字转换为整数