2011-12-02 5 views
0

Pythonic 스타일의 코딩을 사용하여 cgi 스크립트를 포팅하려고합니다.리스트에서 같은 길이의 아이템 계산하기

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

결과는이 C에서 100loc 지금 내가 효율적으로 고해상도 목록에서 같은 길이 항목을 계산하려면 ~했다

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

입니다. 예를 들어, 여기에 res는 길이 1 인 5 개의 요소와 길이 2 인 요소 3 개를 포함합니다.

문제는 시퀀스 문자열이 매우 클 수 있다는 것입니다.

+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

나는 대개 'for in my_list에있는 x를위한 무언가 (x)'를 읽는다. 이것을'for my_list : i = something (x)'에 항상 번역 할 수 있습니다. –