如何使用 Python 有效地舍入由数字组成的字符串?

How can I round a string made of numbers efficiently using Python?

提问人:Bojan Milinic 提问时间:11/30/2022 更新时间:12/1/2022 访问量:326

问:

使用 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]

这段代码有效,但有没有人有任何建议/更好的方法来四舍五入字符串内的数字?

python-3.x 字符串 浮点 舍入

评论

1赞 11/30/2022
label = " - ".join(["{:.2f}".format(float(num)) for num in label.split(" - ")])
1赞 pho 11/30/2022
@bbbbbbbbb,这对于可读性来说可以说是更差的,而对于性能来说却是更好的。
0赞 JayPeerachai 11/30/2022
你能澄清一下你的话吗?在什么方面更好?better
0赞 11/30/2022
相同的时间复杂度,但性能略好。
0赞 Bojan Milinic 12/1/2022
@JayPeerachai 在简洁性方面更好。谢谢bbbbbbbbb,这正是我想要的!

答:

1赞 pho 12/1/2022 #1

您可以使用正则表达式搜索小数点后两位以上的数字,然后对其进行四舍五入。

正则表达式将查找字符串中所有带有小数点的数字,这些小数点被单词边界包围。它被单词边界包围,以防止它拾取附加到单词的数字,例如 .\b\d+\.\d+\bABC0.1234

正则表达式的解释(在线尝试):

\b\d+\.\d+\b

\b        \b     : Word boundary
  \d+  \d+       : One or more digits
     \.          : Decimal point

re.sub 函数允许您指定一个函数,该函数将对象作为输入,并返回所需的替换。让我们定义这样一个函数,它将数字解析为 a ,然后使用 f-string 语法将其格式化为小数点后两位(您可以按照任何您喜欢的方式格式化它,我喜欢这种方式)matchfloat

def round_to_2(match):
    num = float(match.group(0))
    return f"{num:.2f}"

要使用此函数,我们只需将该函数指定为replre.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'