【问题标题】:list slices equal to the last digit列出等于最后一位数字的切片
【发布时间】:2019-05-20 09:06:21
【问题描述】:

我正在做一个学校项目,为此,我正在尝试对字符串进行切片,该字符串等于字符串的最后一位,如果不是,我需要确保每个切片的长度与最后一位相同长度相等,那么我需要添加尾随零

例如:“132567093”应该是['132', '567', '090'] 当我尝试时,我得到['132', '567', '09']

这是我目前拥有的代码

n = input()
int_n = int(n)
num=int(n)
lastdigit=num%10
s = n[:-1]
print([s[idx:idx+lastdigit] for idx,val in enumerate(s) if idx%lastdigit 
== 0])

【问题讨论】:

标签: python-3.x slice zero-padding


【解决方案1】:

另一种方法是使用带有填充值的zip 聚类习语

from itertools import zip_longest as zipl

*digits, length = '132567093'

length = int(length)

print([''.join(t) for t in zipl(*[iter(digits)]*length, fillvalue='0')])
# ['132', '567', '090']

# To sum them together
print(sum(int(''.join(t)) for t in zipl(*[iter(digits)]*length, fillvalue='0')))
# 789

你也可以使用字符串格式:

s='132567093'
length = int(s[-1])
digits = s[:-1]
format_str = "{{:0<{}}}".format(length) # {:0<3}
print([format_str.format(digits[i:i+length]) for i in range(0, len(digits), length)])
# ['132', '567', '090']
print(sum(int(format_str.format(digits[i:i+length])) for i in range(0, len(digits), length)))
# 789

【讨论】:

  • 不适合初学者,但很好地将 iter 的相同引用相乘:)
  • 我希望我能得到信任,但这种模式来自zip documentation
  • 有趣的是,在不加密的情况下将其放在一行中是多么困难。 str.format 有左对齐,但在字符串方面只有空格。
  • 你不能通过"{:0&lt;3}".format("09") 得到"090"吗?
  • sum(map(int, ...))替换最外层的[]
【解决方案2】:

要在左侧补零,有一个str.zfill 方法。

通过反转字符串,应用零填充并再次反转,您可以实现此目的

print([s[idx:idx+lastdigit][::-1].zfill(lastdigit)[::-1] for idx,val in enumerate(s) if idx%lastdigit== 0])

输出:

['132', '567', '090']

没有zfill,您可以计算要添加的字符数。该公式很丑陋,但它更快,因为它不会在此过程中创建 3 个字符串:

[s[idx:idx+lastdigit]+"0"*(max(0,lastdigit-len(s)+idx)) for idx,val in enumerate(s) if idx%lastdigit== 0]

【讨论】:

  • 如何将这些输出相加?(132+567+090 = 789)
猜你喜欢
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多