提问人:Bojan Milinic 提问时间:11/30/2022 更新时间:12/1/2022 访问量:326
如何使用 Python 有效地舍入由数字组成的字符串?
How can I round a string made of numbers efficiently using Python?
问:
使用 Python 3...
我编写了对 ArcGIS 符号系统标注的值进行舍入的代码。标签以字符串形式给出,如“0.3324 - 0.6631”。我的可重现代码是......
label = "0.3324 - 0.6631"
label_list = []
label_split = label.split(" - ")
for num in label_split:
num = round(float(num), 2) # rounded to 2 decimals
num = str(num)
label_list.append(num)
label = label_list[0]+" - "+label_list[1]
这段代码有效,但有没有人有任何建议/更好的方法来四舍五入字符串内的数字?
答:
1赞
pho
12/1/2022
#1
您可以使用正则表达式搜索小数点后两位以上的数字,然后对其进行四舍五入。
正则表达式将查找字符串中所有带有小数点的数字,这些小数点被单词边界包围。它被单词边界包围,以防止它拾取附加到单词的数字,例如 .\b\d+\.\d+\b
ABC0.1234
正则表达式的解释(在线尝试):
\b\d+\.\d+\b
\b \b : Word boundary
\d+ \d+ : One or more digits
\. : Decimal point
re.sub
函数允许您指定一个函数,该函数将对象作为输入,并返回所需的替换。让我们定义这样一个函数,它将数字解析为 a ,然后使用 f-string 语法将其格式化为小数点后两位(您可以按照任何您喜欢的方式格式化它,我喜欢这种方式)match
float
def round_to_2(match):
num = float(match.group(0))
return f"{num:.2f}"
要使用此函数,我们只需将该函数指定为repl
re.sub
label = "0.3324 - 0.6631 ABC0.1234 0.12 1.234 1.23 123.4567 1.2"
label_rep = re.sub(r"\b\d+\.\d+\b", round_to_2, label)
这给出了:label_rep
'0.33 - 0.66 ABC0.1234 0.12 1.23 1.23 123.46 1.20'
这样做的好处是,您不需要对任何分隔符或拆分字符进行硬编码。字符串中的所有数字都已找到并格式化。请注意,如果需要,这将在数字上添加额外的零。
2赞
0x0fba
12/1/2022
#2
此解决方案不会尝试对序列进行操作,而是对 2 个值进行操作。
对我来说更具可读性。
x, _, y = label.partition(" - ")
label = f"{float(x):.2f} - {float(y):.2f}"
1赞
SergFSM
12/1/2022
#3
稍微不同的方法:
label = "0.3324 - 0.6631"
'{:.2f}-{:.2f}'.format(*map(float,label.split('-')))
>>>
'0.33-0.66'
评论
label = " - ".join(["{:.2f}".format(float(num)) for num in label.split(" - ")])
better