2012-07-06 54 views
3

剛纔寫的功能...尋找更Python apporach

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

但是並不覺得Python的「足夠」,建議?

回答

2

在我看來,代碼是直截了當的,所以你應該更喜歡它到一些不可讀的混亂。 我只想縮短了一點:

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

也:'count + = 1'好一點。 – Keith 2012-07-06 07:33:27

+0

是的,應該使用休息(對我很恥辱) – Paul 2012-07-06 07:35:29

+0

哦,是的,我忘了:) – acondolu 2012-07-06 07:36:09

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) 
+0

我明白了,很多英里能夠爲我覆蓋,thanx! – Paul 2012-07-06 07:32:01

+0

出於好奇 - 與OP相比,這段代碼的性能如何?我知道Python足以閱讀它,這對我來說似乎是一個相當性能的打擊。更重要的是,我真的認爲OP的代碼更具可讀性(但這只是一個偏好問題,我猜)。 – 2012-07-06 07:43:54

+1

@NikolaAnusev'itertools'在C中實現。對於較大的輸入,它通常非常有效。對於小輸入來說,函數調用的開銷可能會使速度變慢......但對於小輸入,您通常不關心速度。但是,對於具有大量前綴大小的輸入,由於構建列表,這可能會*效率較低。我編輯了另一個版本,可以避免效率低下。 – Amber 2012-07-06 07:46:18

5

您可以剝離匹配的前導字符並根據長度計算差異。

def nrofleadingchars(stringtotest, testchar='\t'): 
    return (len(stringtotest) - len(stringtotest.lstrip(testchar)) 
+0

這是更好的課程,我不知道可選的lstrip參數,thanx! – Paul 2012-07-06 07:31:29

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 

這些是時間比率。向下的第一列可以被讀爲「倍慢」。