Python 右键将字符串拆分为3组

Python 右键将字符串拆分为3组,python,python-3.x,Python,Python 3.x,什么是最有利于右分为三组的方法?我已经看到了这个答案,但我需要它正确对齐。最好是一个简单有效的无进口单班轮 '123456789'=['123'、'456'、'789'] '12345678'=['12'、'345'、'678'] '1234567'=['1'、'234'、'567'] 简单(从链接中的答案重复): [int(a[:-1][i:i+3][::-1]),用于范围(0,len(a),3)][:-1] 说明:a[:-1]是a 我们将用切片组成反转 第一步:颠倒清单 第二步:把三个的部

什么是最有利于右分为三组的方法?我已经看到了这个答案,但我需要它正确对齐。最好是一个简单有效的无进口单班轮

  • '123456789'=['123'、'456'、'789']
  • '12345678'=['12'、'345'、'678']
  • '1234567'=['1'、'234'、'567']
    • 简单(从链接中的答案重复):

      [int(a[:-1][i:i+3][::-1]),用于范围(0,len(a),3)][:-1]

      说明:
      a[:-1]
      a
      我们将用切片组成反转

      第一步:颠倒清单 第二步:把三个的部分切成薄片 第三步:再次颠倒列表,以递增顺序显示数字 最后一步:颠倒整个列表 奖励:功能性合成糖 如果有函数的专有名称,则调试更容易

      invert = lambda a: a[::-1]
      slice  = lambda array, step : [ int( invert( array[i:i+step]) ) for i in range(len(array),step)  ]
      
      answer = lambda x: invert ( slice ( invert (x) , 3 ) )
      answer('123456789')
      #>> [123,456,789]
      

      这是我想到的最好的:

      [a[max(i-3,0):i] for i in range(len(a), 0, -3)][::-1]
      
      还有一个,它不反转列表,但有点难看:

      [a[max(0,i):i+3] for i in range((len(a)-1)%3-2, len(a), 3)]
      

      最短的并不总是最有活力的

      def by3(s):
          out = []
          while len(s):
              out.insert(0, s[-3:])
              s = s[:-3]
          return out
      
      四轮班轮:

      splitted_number = []
      while number:
          number, r = number[:-3], number[-3:]
          splitted_number.insert(0, r)
      

      另一种方法,不确定效率(如果它们已经是数字而不是字符串会更好),但在2.7+中是另一种方法

      for i in map(int, ['123456789', '12345678', '1234567']):
          print i, '->', format(i, ',').split(',')
      
      #123456789 -> ['123', '456', '789']
      #12345678 -> ['12', '345', '678']
      #1234567 -> ['1', '234', '567']
      

      如果有人觉得这个有用,我的建议是:
      textwrap
      是做这件事的内置模块

      from textwrap import wrap
      
      a = '123456789'
      b = wrap(a, 3)
      >>> b ['123', '456', '789']
      

      扩展@Manu-answer

      from textwrap import wrap
      
      a = '123456789'
      b = wrap(a, 3)
      print(b)
      
      newlist = []
      
      for i in b:
          newlist.append(int(i))
         
      print(newlist)
      


      不起作用。我得到
      ValueError:int()的文本无效,以10为基数:'
      表示
      a='123456789'
      。是吗?我看不出“三组”位是从哪里来的。@user1461607不确定您的意思,但是
      格式化(num),,'
      将字符串格式化为常规的
      分隔的3块,这样在
      上拆分就可以得到所需的结果。@user1461607这是格式化数字的一个有用功能(因为它非常常见)... 所以你可以把它一行写成
      格式(int('1234567'),',')。拆分(',')
      如果你想…聪明的解决方案:-)我想知道它和我的性能相比如何wise@FabianHenze问题是,格式/拆分方法正在利用底层实现来完成“脏活”—因此会更快。。。瓶颈在于首先将字符串转换为整数,以便格式化工作。。。
      >>> by3(a)
      ['12', '345', '678'] 
      
      splitted_number = []
      while number:
          number, r = number[:-3], number[-3:]
          splitted_number.insert(0, r)
      
      for i in map(int, ['123456789', '12345678', '1234567']):
          print i, '->', format(i, ',').split(',')
      
      #123456789 -> ['123', '456', '789']
      #12345678 -> ['12', '345', '678']
      #1234567 -> ['1', '234', '567']
      
      from textwrap import wrap
      
      a = '123456789'
      b = wrap(a, 3)
      >>> b ['123', '456', '789']
      
      from textwrap import wrap
      
      a = '123456789'
      b = wrap(a, 3)
      print(b)
      
      newlist = []
      
      for i in b:
          newlist.append(int(i))
         
      print(newlist)
      
      ['123', '456', '789']
      [123, 456, 789]
      
      [Program finished] 
      
      n = 1234567890
      v = [] 
      while n > 0:
          n, r = divmod(n, 1000) 
          v.insert(0, r)
      
      print(v)
      
      [1, 234, 567, 890]
      
      [Program finished]