好的,我需要一些帮助。我有以下字符串,始终采用“ 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可以执行一百万次某些代码。
延长“ aaaaaaaaaaaaaaaaaa ....,12”的长度以使其极端。
他们如何比较?
字符串拆分:1400次“ a”的运行一百万次耗时1秒。
字符串拆分:4000次“ a”的运行100万次耗时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.
Try it online at repl.it
我认为这在算法上并不比O(n)更好,但是在假设的约束下,我使您比str.split()拥有更多的知识,并且可以利用它来跳过大部分字符串并击败它在实践中-文本部分越长,数字部分越短,您就越受益。
关于python - 在某个字符后从字符串中提取数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39481788/