哎呀,我需要一些帮助。我有以下字符串,始终采用“char,num”格式:
s = "abcdef,12"
v = "gbhjjj,699"
我只想获取逗号后的数字,我该怎么做而不用逗号作为分隔符来分割字符串?
我尝试了 s[-2:] 和 v[-3:] 哪个有效,但我如何在不知道位数的情况下使其有效?
请您参考如下方法:
假设:
- 您知道字符串中有一个逗号,因此您不必搜索整个字符串来确定是否存在逗号。
- 您知道该模式是
'many_not_digits,few_digits',因此逗号两侧的左右部分的大小存在很大的不平衡。 - 您无需遍历即可到达字符串的末尾,you can in Python because string indexing is constant time
然后您可以从末尾开始并向后走寻找逗号,与从左侧走寻找逗号相比,这对您的示例来说总体工作量要少。
用 Python 代码工作比使用用 C 编写的 Python 引擎代码慢得多,对吧?那么它真的会更快吗?
- 制作一个字符串“aaaaa....,12”
- 使用
timeit模块比较每种方法 - 拆分或右走。 - Timeit 对一些代码进行了一百万次运行。
- 延长“aaaaaaaaaaaaaaaa....,12”的长度,使其达到极限。
他们如何比较?
- 字符串拆分:1400 个“a”运行一百万次只用了 1 秒。
- 字符串拆分:4000 个“a”运行一百万次只用了 2 秒。
- 向右走:1400“a”跑一百万次只用了 0.4 秒。
- 向右走:999,999“a”跑一百万次用了……0.4 秒。
!
from timeit import timeit
_split = """num = x.split(',')[-1]"""
_rwalk = """
i=-1
while x[i] != ',':
i-=1
num = x[i+1:]
"""
print(timeit(_split, setup='x="a"*1400 + ",12"'))
print(timeit(_rwalk, setup='x="a"*999999 + ",12"'))
例如
1.0063155219977489 # "aaa...,12" for 1400 chars, string split
0.4027107510046335 # "aaa...,12" for 999999 chars, rwalked. Faster.
我不认为这在算法上比 O(n) 更好,但是由于假设的限制,我让你比 str.split() 拥有更多的知识,并且可以利用它来跳过大部分字符串的遍历并在实践中击败它 - 文本部分越长,数字部分越短,您受益越多。
