如何在Python 3.5中转换列表,例如:
r_file.txt
到x=[1, 3, 5]
的int(整个int)?
答案 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
的列表并且想要将它们加在一起,则可以map
与str
一起使用,将它们转换为字符串,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]