【问题标题】:How to concatenate two integers in Python?如何在 Python 中连接两个整数?
【发布时间】:2021-08-19 04:27:23
【问题描述】:

如何在 Python 中连接两个整数?例如,给定1020,我想要返回值"1020"

【问题讨论】:

    标签: python concatenation


    【解决方案1】:

    将两者都转换为字符串,连接字符串,然后将结果转换回整数:

    z = int(str(x) + str(y))
    

    【讨论】:

      【解决方案2】:

      使用数学可能比转换为 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。为此,您需要添加参数以指定每个整数中的位数,或使用字符串。

      【讨论】:

      • 你不认为导入数学会减慢速度吗?
      • @gokcehan 是的,但是如果您要在循环中多次调用此函数,那么导入数学的时间将是微不足道的
      • 另外,它在数学上比字符串操作更有意义。
      • 为什么不使用ceil 而不是使用floor 并添加一个?
      • @mbomb007 ceil(num) != floor(num) + 1 对于所有 num。具体来说,如果num 是一个整数,那么ceil(num) == floor(num)。如果您将floor()+1 替换为ceil(),则当第二个参数是10 的整数幂时,该函数将无法正常工作。(由于log10(10^n) = n 您处于floor(n) == ceil(n) 的情况)
      【解决方案3】:

      示例 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 版本中未定义-强>

      【讨论】:

        【解决方案4】:

        使用旧式字符串格式:

        >>> x = 10
        >>> y = 20
        >>> z = int('%d%d' % (x, y))
        >>> print z
        1020
        

        【讨论】:

          【解决方案5】:

          在接受的答案中给出了在 python 中执行此操作的最佳方法 - 但如果您想在 jinja2 模板中执行此操作 - 连接运算符 ~ 为您提供了一种简洁的方法,因为它会查找 unicode 表示在所有对象中,您也可以“连接整数”。

          也就是说你可以这样做(给定a=10b=20):

          {{ a ~ b }}
          

          【讨论】:

            【解决方案6】:

            当然,“正确”的答案是康斯坦丁的答案。但是如果你仍然想知道如何在不使用字符串转换的情况下做到这一点,只需使用数学:

            import math
            
            def numcat(a,b):
                return int(math.pow(10,(int(math.log(b,10)) + 1)) * a + b)
            
            >> numcat(10, 20)
            >> 1020
            

            【讨论】:

            • 无法将 0 likelastnum=3 连接为 numcat(lastnum,0) ValueError: 数学域错误
            【解决方案7】:

            一个粗略但有效的实现:

            i1,i2 = 10,20
            num = int('%i%i' % (i1,i2))
            

            基本上,您只需将两个数字合并为一个字符串,然后将其转换回 int。

            【讨论】:

              【解决方案8】:

              只是给出另一个解决方案:

              def concat_ints(a, b):
                  return a*(10**len(str(b)))+b
              
              >>> concat_ints(10, 20)
              1020
              

              【讨论】:

                【解决方案9】:

                使用此功能,您可以连接任意数量的数字

                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))),它更快:)
                【解决方案10】:

                连接整数列表

                int(''.join(map(str, my_list)))
                

                【讨论】:

                  【解决方案11】:

                  在我的测试中使用数学转换器比转换为字符串并返回更快:

                  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
                  • @kafran 我想我那里有一个额外的零。我的意思是 x*10 不是 x*100。更正了它。我的回应是对先前关于执行速度的评论。在我的观察中,串起来和返回的速度较慢。希望有帮助!
                  • 我同意。对我来说,这是连接两个 int 的最佳方式。
                  【解决方案12】:

                  一个不错的方法是使用内置的 reduce() 函数:

                  reduce(lambda x,y:x*10+y,[10,20])
                  

                  【讨论】:

                    【解决方案13】:

                    这是另一种方法:

                    a = 10
                    b = 20
                    
                    x = int('{}{}'.format(a, b))
                    

                    【讨论】:

                    • 这是我认为最好的方式
                    【解决方案14】:
                    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
                    

                    【讨论】:

                    • 如果你也能为你的代码写一些解释就好了。
                    • 嗯。 -1:你的 concatenate_int 函数看起来很像 @Matt 的答案。
                    猜你喜欢
                    • 2012-09-23
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-02-27
                    • 2021-08-06
                    • 2020-08-29
                    • 2022-10-06
                    • 2010-12-15
                    相关资源
                    最近更新 更多