2014-05-09 2 views
1

현재 두 개의 문자열을 가져 와서 출력의 세 번째 줄에 표시된 것과 일치하는 영역을 식별하는 데 완벽하게 작동하는 아래 코드가 있습니다.중첩 목록을 입력으로 사용하는 방법은 무엇입니까?

첫 번째 일치 문자열이 끝날 때마다 0에서부터 코드의 다음 부분까지 말하고 싶습니다. 주어진 예제에서는 0에서 9까지를 제거합니다. 그러나 0부터 시작하면이 작업을 수행하십시오 . 중첩 된 목록을 사용하여 코드를 수행하는 방법에 대한 설명이 훌륭해 지는지 확신 할 수 없습니다.

from collections import defaultdict 
from itertools import groupby 

def class_chars(chrs): 
    if 'N' in chrs: 
     return 'unknown' 
    elif chrs[0] == chrs[1]: 
     return 'match' 
    else: 
     return 'not_match' 

s1 = 'aaaaaaaaaaN123bbbbbbbbbbQccc' 
s2 = 'aaaaaaaaaaN456bbbbbbbbbbPccc' 
n = 0 
consec_matches = [] 
chars = defaultdict(int) 

for k, group in groupby(zip(s1, s2), class_chars): 
    elems = len(list(group)) 
    chars[k] += elems 
    if k == 'match': 
     consec_matches.append((n, n+elems-1)) 
    n += elems 

print chars 
print consec_matches 
print [x for x in consec_matches if x[1]-x[0] >= 9] 

출력 :

defaultdict(<type 'int'>, {'not_match': 4, 'unknown': 1, 'match': 23}) 
[(0, 9), (14, 23), (25, 27)] 
[(0, 9), (14, 23)] 
+0

및 어떤 결과물을 원하니? –

+0

중첩 된 목록은 x [1] -x [0]> = 9 인 경우 consec_matches에서 x의 x에 대한 print [x]의 일치 항목을 추출한 결과입니다. 누군가이 출력을 사용하는 방법을 말해 줄 수 있으면 괜찮습니다. 내가 말한대로 0이 목록에 있지만 0 일 경우 숫자를 선택할 수 있기를 원하지만 나는 이것을 수행하는 방법을 모른다. 예를 들면 9가 될 것입니다. – Tom

+0

그룹화를 '[(0, 9), (14, 23), (25, 27)]'로 유지하고 내부 요소에 액세스하거나 하나의 목록으로 모두 병합 하시겠습니까? –

답변

1

확실하지 나는 완전히 당신이 원하는 것을 얻을 수 있지만, 당신이 사용하는 방향으로 날 지점 수 있습니다 다음에서 오는 중첩 된 목록입니다

In [12]: l=[(0, 9), (14, 23), (25, 27)] 

In [13]: flatten_l= [x for y in l for x in y] 

In [14]: flatten_l 
Out[14]: [0, 9, 14, 23, 25, 27] 

# access second tuple arg if first is equal to 0 
In [15]: get_num_after=[y[1] for y in l for x in y if x ==0 ] 
In [16]: get_num_after 
Out[16]: [9] 
관련 문제