通过Python实现数字范围省略
我想用Python写一个代码,来处理数字范围的简化,就像下面的图片所示。
数字范围(比如页码范围)通常会被简化,比如42–43可以写成42–3,123–128可以写成123–8。这种处理方式叫做数字范围简化,也可以称为数字缩写,或者更随意地说是“丢掉数字”。
我想知道怎么通过Python编程来实现这个功能。
最小可重现示例:
输入:
3–10
12–18
71–72
96–117
100–104
1100–1113
101–108
808–833
1103–1104
321–328
498–532
1013–1019
1087–1089
1496–1500
11564–11615
12991–13001
2 个回答
1
你可以把每个输入当作字符串来读取,然后把输入分成两个部分,看看它们之间的差距。可以这样做:
my_input = input("Enter range: ")
my_input = [int(x) for x in my_input.split("-")]
my_input = f"{my_input[0]}-{my_input[1] if int(my_input[1] / 10) != int(my_input[0] / 10) else my_input[1] % 10}"
print(my_input)
在这个代码片段中,我把文本(比如 "122-129")用 '-' 分开,然后把它转换成一个整数数组(变成 [122, 129])。接着,我把这两个数字都除以 10,再次转换成整数,因为转换成整数后,小数部分会被去掉(就像用 Math.floor() 一样)。如果得到的结果是一样的,那我就可以通过对第二个数字取模 10 来缩短它(这就是把这个数字除以 10 后剩下的部分,比如 129 % 10 = 9)。
2
注意到输出总是以 left
-right'
的形式出现,其中 right'
是 right
去掉了共同前缀的部分。
首先,把输入分开:
left, right = input_string.split("-")
然后修改 right
:
def get_shortened_right(left: str, right: str) -> str:
for i in range(min(len(left), len(right)):
if left[i] != right[i]:
break # stop if not common prefix
return right[i:]
接下来,你就可以很容易地按照需要的格式构建输出:
final_result = f"{left}-{new_right}"