2011-12-02 75 views
0

我想使用pythonic編碼風格移植cgi腳本。在列表中計算相同長度的項目

sequence = "aaaabbababbbbabbabb" 
res = sequence.split("a") + sequence.split("b") 
res = [l for l in res if l] 

結果是

>>> res 
['bb', 'b', 'bbbb', 'bb', 'bb', 'aaaa', 'a', 'a', 'a', 'a'] 

這是〜100loc在C.現在我想指望用有效的資源列表的長度相同的項目。對於這裏例如水庫包含5個元素與長度爲1,以長度爲2 3種元素和2族元素與長度爲4

的問題是,該序列字符串可以是非常大的。

+0

你能解釋一下你的代碼的作用嗎?我不確定你試圖用它來完成什麼。 – Blender

+0

你應該注意你想要的輸出,例如帶數字鍵和值的字典。 –

+0

@Blender我的代碼查找具有相同字符的子序列。我在這裏問的是一個計算列表中存在一個長度爲x的序列的次數的方法。 – kechapito

回答

6

生成字符串長度的直方圖最簡單的方式給出一個字符串列表是使用collections.Counter

>>> from collections import Counter 
>>> a = ["a", "b", "aaa", "bb", "aa", "bbb", "", "a", "b"] 
>>> Counter(map(len, a)) 
Counter({1: 4, 2: 2, 3: 2, 0: 1}) 

編輯:還有找到等於字符的運行,即itertools.groupby()更好的辦法:

>>> sequence = "aaaabbababbbbabbabb" 
>>> Counter(len(list(it)) for k, it in groupby(sequence)) 
Counter({1: 5, 2: 3, 4: 2}) 
+0

我不會回答你的評論。我會接受這個解決方案。 – kechapito

1

你也許可以做類似

occurrences_by_length={} # map of length of string->number of strings with that length. 
for i in (len(x) for x in (sequence.split("a")+sequence.split("b"))): 
    if i in occurrences_by_length: 
     occurrences_by_length[i]=occurrences_by_length[i]+1 
    else: 
     occurrences_by_length[i]=1 

現在,occurrences_by_length將每個字符串的長度映射爲該長度的字符串出現的次數的映射。

+1

我通常在'my_list中找到x'(for x in my_list)''我讀的時候很尷尬。你可以隨時把它翻譯成'for my_list:i = something(x)'。 –