【问题标题】:Split number into groups by magnitude按大小将数字分成几组
【发布时间】:2023-01-19 16:07:09
【问题描述】:

输入34567890

我想要一个输出:[34, 567, 890]

我可以用一些模数学和地板除法来做到这一点

num=34567890
output_list = []
division_tracker = num
while division_tracker > 0:
    output_list.insert(0, division_tracker%1000)
    division_tracker = division_tracker//1000

有没有更好的办法?

【问题讨论】:

  • 我可能会说不,但我不知道你会认为什么“更好”。
  • 你可以把它们串起来切片!

标签: python python-3.x list


【解决方案1】:

这有点hacky,但是:

>>> list(map(int, f'{34567890:,}'.split(',')))
[34, 567, 890]

f'{n:,}' 生成整数n 的字符串,以逗号作为千位分隔符,我们将生成的字符串以逗号分割,并将这些部分转换为int

【讨论】:

  • 等价地,一个人可以做[*map(int,'{:,}'.format(34567890).split(','))]
  • 我必须承认我并没有真正明白这一点,因为它比使用模数要慢。
  • @Cubix48 至少这样写更快
【解决方案2】:

感谢@fsimonjetz

如果你想使用列表理解而不是地图:

[int(x) for x in f'{34567890:,}'.split(',')]
[34, 567, 890]

【讨论】:

    【解决方案3】:

    用一个切片方法在字符串上:

    s = str(345678)
    n = len(s)
    r = n % 3 # remainder
    
    groups = [int(s[r + 3*i:r + 3*(i+1)]) for i in range(n//3)]
    if r != 0:
        groups = [int(s[-r:])] + groups
    
    print(groups)
    

    编辑

    一种正则表达式方法: 嵌套组不允许根据数字的数量显式构造模式。

    import re
    
    s = '12345678235156721'
    
    regex = ''
    if (r:=len(s) % 3) != 0:
        regex += '(d{{{}}})'.format(r)
    regex += '(d{3})' * (len(s) // 3)
    regex = r'{}'.format(regex)
    
    grps = list(map(int, re.search(regex, s).groups()))
    
    

    输出

    [12, 345, 678, 235, 156, 721]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多