3

刚写了这个函数...

def nrofleadingchars(stringtotest, testchar='\t'):
    count = 0
    for c in stringtotest:
        if c == testchar:
            count = count + 1
        else:
            return count
    return count

但是感觉pythonic'不够',建议?

4

4 回答 4

9
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)
于 2012-07-06T07:26:50.877 回答
5

您可以去除匹配的前导字符并根据长度计算差异。

def nrofleadingchars(stringtotest, testchar='\t'):
    return (len(stringtotest) - len(stringtotest.lstrip(testchar))
于 2012-07-06T07:27:42.440 回答
2

在我看来,代码很简单,所以你应该更喜欢它而不是一些难以理解的混乱。我会缩短一点:

def nrofleadingchars(stringtotest, testchar='\t'):
    count = 0
    for c in stringtotest:
        if c != testchar:
            break
        count += 1
    return count
于 2012-07-06T07:32:07.827 回答
1

这是一个非答案,但我不知道如何将这些信息放在这里。

如果性能也是一个考虑因素(对我来说总是如此),这里是当前答案的报告。

                          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

这些是时间比率。向下的第一列可以理解为“慢几倍”。

于 2012-07-06T08:02:53.420 回答