2011-12-02 80 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)'。 –