刚写了这个函数...
def nrofleadingchars(stringtotest, testchar='\t'):
count = 0
for c in stringtotest:
if c == testchar:
count = count + 1
else:
return count
return count
但是感觉pythonic'不够',建议?
刚写了这个函数...
def nrofleadingchars(stringtotest, testchar='\t'):
count = 0
for c in stringtotest:
if c == testchar:
count = count + 1
else:
return count
return count
但是感觉pythonic'不够',建议?
import itertools
def nrofleadingchars(stringtotest, testchar='\t'):
return len(list(itertools.takewhile(lambda x: x == testchar, stringtotest)))
由于需要构建一个列表,这对于具有非常大前缀的事物可能效率较低。如果我可能要处理这样的事情,我可能会写这个:
def num_leading_chars(a_string, prefix='\t'):
for idx, char in enumerate(a_string):
if char != prefix:
return idx
return len(a_string)
您可以去除匹配的前导字符并根据长度计算差异。
def nrofleadingchars(stringtotest, testchar='\t'):
return (len(stringtotest) - len(stringtotest.lstrip(testchar))
在我看来,代码很简单,所以你应该更喜欢它而不是一些难以理解的混乱。我会缩短一点:
def nrofleadingchars(stringtotest, testchar='\t'):
count = 0
for c in stringtotest:
if c != testchar:
break
count += 1
return count
这是一个非答案,但我不知道如何将这些信息放在这里。
如果性能也是一个考虑因素(对我来说总是如此),这里是当前答案的报告。
nrofleadingchars_orig | nrofleadingchars_1 | nrofleadingchars_it | num_leading_chars | nrofleadingchars_len -------------------------------------------------- -------------------------------------------------- ------------------------------ nrofleadingchars_ori: 1.0 | 1.05393899527 | 0.603740407137 | 1.2923361749 | 23.1678811895 nrofleadingchars_1:0.948821520491 | 1.0 | 0.572841891082 | 1.22619637446 | 21.9821842568 nrofleadingchars_it: 1.65634101706 | 1.74568238735 | 1.0 | 2.14054941432 | 38.3739118926 num_leading_chars: 0.773792469344 | 0.815530057691 | 0.467169780482 | 1.0 | 17.9271319951 nrofleadingchars_len: 0.0431632047756 | 0.045491384674 | 0.0260593708246 | 0.0557813709562 | 1.0
这些是时间比率。向下的第一列可以理解为“慢几倍”。