【发布时间】:2021-08-19 04:27:23
【问题描述】:
如何在 Python 中连接两个整数?例如,给定10 和20,我想要返回值"1020"。
【问题讨论】:
标签: python concatenation
如何在 Python 中连接两个整数?例如,给定10 和20,我想要返回值"1020"。
【问题讨论】:
标签: python concatenation
将两者都转换为字符串,连接字符串,然后将结果转换回整数:
z = int(str(x) + str(y))
【讨论】:
使用数学可能比转换为 str 和返回的解决方案更快:
如果你可以假设一个两位数的秒数:
def f(x, y):
return x*100+y
用法:
>>> f(1,2)
102
>>> f(10,20)
1020
虽然,您可能希望包含一些检查以验证第二个数字不超过两位数。或者,如果你的第二个数字可以是任意位数,你可以这样做:
import math
def f(x, y):
if y != 0:
a = math.floor(math.log10(y))
else:
a = -1
return int(x*10**(1+a)+y)
用法:
>>> f(10,20)
1020
>>> f(99,193)
99193
但是,此版本不允许您将 03 和 02 之类的数字合并以获得 0302。为此,您需要添加参数以指定每个整数中的位数,或使用字符串。
【讨论】:
ceil 而不是使用floor 并添加一个?
ceil(num) != floor(num) + 1 对于所有 num。具体来说,如果num 是一个整数,那么ceil(num) == floor(num)。如果您将floor()+1 替换为ceil(),则当第二个参数是10 的整数幂时,该函数将无法正常工作。(由于log10(10^n) = n 您处于floor(n) == ceil(n) 的情况)
示例 1:(示例 2 更快,别说我没有警告你!)
a = 9
b = 8
def concat(a, b):
return eval(f"{a}{b}")
例子:
>>> concat(a, b)
98
示例 2:
对于认为eval 是“邪恶”的人,这里有另一种方法:
a = 6
b = 7
def concat(a, b):
return int(f"{a}{b}")
例子:
>>> concat(a, b)
67
编辑:
我认为对这些代码进行计时会很方便,请看下面:
>>> min(timeit.repeat("for x in range(100): int(str(a) + str(b))", "",
number=100000, globals = {'a': 10, 'b': 20}))
9.107237317533617
>>> min(timeit.repeat("for x in range(100): int(f'{a}{b}')", "",
number=100000, globals = {'a': 10, 'b': 20}))
6.4986298607643675
>>> min(timeit.repeat("for x in range(5): eval(f'{a}{b}')", "", #notice the range(5) instead of the range(100)
number=100000, globals = {'a': 10, 'b': 20}))
4.089137231865948 #x20
时代:
eval: about 1 minute and 21 seconds.
original answer: about 9 seconds.
my answer: about 6 and a half seconds.
结论:
原始答案看起来确实更可读,但是如果您需要良好的速度,请选择int(f '{vara}{varb}')
P.S:我的 int(f'{a}{b}) 语法仅适用于 python 3.6+,因为 f'' 语法在 python 3.6 版本中未定义-强>
【讨论】:
使用旧式字符串格式:
>>> x = 10
>>> y = 20
>>> z = int('%d%d' % (x, y))
>>> print z
1020
【讨论】:
在接受的答案中给出了在 python 中执行此操作的最佳方法 - 但如果您想在 jinja2 模板中执行此操作 - 连接运算符 ~ 为您提供了一种简洁的方法,因为它会查找 unicode 表示在所有对象中,您也可以“连接整数”。
也就是说你可以这样做(给定a=10 和b=20):
{{ a ~ b }}
【讨论】:
当然,“正确”的答案是康斯坦丁的答案。但是如果你仍然想知道如何在不使用字符串转换的情况下做到这一点,只需使用数学:
import math
def numcat(a,b):
return int(math.pow(10,(int(math.log(b,10)) + 1)) * a + b)
>> numcat(10, 20)
>> 1020
【讨论】:
lastnum=3 连接为 numcat(lastnum,0) ValueError: 数学域错误
一个粗略但有效的实现:
i1,i2 = 10,20
num = int('%i%i' % (i1,i2))
基本上,您只需将两个数字合并为一个字符串,然后将其转换回 int。
【讨论】:
只是给出另一个解决方案:
def concat_ints(a, b):
return a*(10**len(str(b)))+b
>>> concat_ints(10, 20)
1020
【讨论】:
使用此功能,您可以连接任意数量的数字
def concat(*args):
string = ''
for each in args:
string += str(each)
return int(string)
例如 concat(20, 10, 30) 将返回 201030 一个整数
或
你可以使用单行程序
int(''.join(str(x) for x in (20,10,30)))
这也将返回201030。
【讨论】:
concat = lambda *args: int("".join(map(str, args))),它更快:)
连接整数列表
int(''.join(map(str, my_list)))
【讨论】:
在我的测试中使用数学转换器比转换为字符串并返回更快:
In [28]: fn = lambda x, y: x*10 + y
In [29]: timeit fn(1,2)
88.4 ns ± 1.26 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [30]: timeit int(str(1) + str(2))
427 ns ± 11.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
【讨论】:
int(str(1) + str(2)) == fn(1,2) => False
一个不错的方法是使用内置的 reduce() 函数:
reduce(lambda x,y:x*10+y,[10,20])
【讨论】:
这是另一种方法:
a = 10
b = 20
x = int('{}{}'.format(a, b))
【讨论】:
def concatenate_int(x, y):
try:
a = floor(log10(y))
except ValueError:
a = 0
return int(x * 10 ** (1 + a) + y)
def concatenate(*l):
j = 0
for i in list(*l):
j = concatenate_int(j, i)
return j
【讨论】:
concatenate_int 函数看起来很像 @Matt 的答案。