如何在 Python 中连接两个整数?例如,给定10
and 20
,我想要一个返回值"1020"
。
14 回答
将两者都转换为字符串,连接字符串,然后将结果转换回整数:
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。为此,您需要添加参数以指定每个整数中的位数,或使用字符串。
例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}')
PS:我的 int(f'{a}{b}) 语法仅适用于 python 3.6+,因为 f'' 语法在 python 3.6-版本中未定义-
使用旧式字符串格式:
>>> x = 10
>>> y = 20
>>> z = int('%d%d' % (x, y))
>>> print z
1020
当然,“正确”的答案将是康斯坦丁的答案。但是,如果您仍然想知道如何在不使用字符串强制转换的情况下做到这一点,只需使用数学:
import math
def numcat(a,b):
return int(math.pow(10,(int(math.log(b,10)) + 1)) * a + b)
>> numcat(10, 20)
>> 1020
一个粗略但有效的实现:
i1,i2 = 10,20
num = int('%i%i' % (i1,i2))
基本上,您只需将两个数字合并为一个字符串,然后将其转换回 int。
在接受的答案中给出了在 python 中执行此操作的最佳方法-但如果您想在 jinja2 模板中执行此操作-连接运算符~
为您提供了一种简洁的方法,因为它查找所有对象的 unicode 表示,因此,您也可以“连接整数”。
那就是你可以这样做(给定a=10
和b=20
):
{{ a ~ b }}
只是给出另一个解决方案:
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
。
连接整数列表
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)
一个不错的方法是使用内置的 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