如何在 Python 中连接两个整数?例如,给定
10
和 20
,我想要返回值 1020
。
将两者都转换为字符串,连接字符串,然后将结果转换回整数:
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}')
P.S:我的 int(f'{a}{b}) 语法 仅适用于 python 3.6+,因为 f'' 语法在 python 版本 3.6-
中未定义在 python 中执行此操作的最佳方法已在接受的答案中给出 - 但如果您想在 jinja2 模板中执行此操作 - 连接运算符
~
为您提供了一种简洁的方法,因为它会查找所有内容的 unicode 表示形式对象,因此,您也可以“连接整数”。
也就是说,你可以做到这一点(给定
a=10
和 b=20
):
{{ a ~ b }}
使用旧式字符串格式:
>>> x = 10
>>> y = 20
>>> z = int('%d%d' % (x, y))
>>> print z
1020
一个粗糙但可行的实现:
i1,i2 = 10,20
num = int('%i%i' % (i1,i2))
基本上,您只需将两个数字合并为一个字符串,然后将其转换回 int。
当然,“正确”答案是康斯坦丁的答案。但如果您仍然想知道如何在不使用字符串转换的情况下仅使用数学来完成此操作:
import math
def numcat(a,b):
return int(math.pow(10,(int(math.log(b,10)) + 1)) * a + b)
>> numcat(10, 20)
>> 1020
只是给出另一个解决方案:
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))
我想我应该为任意位数添加一个通用公式:
import math
from functools import reduce
def f(*args):
def numcat(a, b):
return int(math.pow(10, (round(math.log(b, 10)) + 1)) * a + b)
return reduce(numcat, args)
c = f(10, 1, 2, 1000, 3) # 101210003
您可以简单地将两个整数值转换为字符串,将它们相加,然后再次将它们转换为整数:
x, y = str(10), str(20)
z = int(x + y)
尝试
print(f"{10}" + f"{20}")
应该可以用!!
Number=input("Enter the Number here: ")
digit_1=Number[0]
digit_2=Number[1]
total=int(Number[0])+int(Number[1])
print("The total is:", total)
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