2013-05-27 2 views
-1

일치하는 인덱스 [0]가있는 경우 행을 통과하여 인덱스 x를 합산해야하는 코드가 있습니다. 이것을 만드는 가장 좋은 해결책은 무엇입니까? 나는 defaultdict를 가질 수 있었고 인덱스 [0]에 일치하는 것이 있으면 값을 추가 할 것입니다. 내가 줄 단위로 읽을 수있는 방법이 있고, 임시 메모리에 인덱스 [0]을 항상 가지고 있고, 다음 인덱스 [0]과 일치한다면 그것은 합계를 할 것입니까?스마트 계산을위한 임시 메모리 사용

with open("test.txt") as f: 
    dic = defaultdict(list) 
    for line in f: 
     spl =line.split("\t") 
     if("Fam" in line): 
      dic[spl[0]].append(spl[1:]) 
      a = float(spl[5]) 
      b = float(spl[6]) 
      sum = a * b 
      output = str(sum) 
      this = line.strip() + "\t"+output 
      if("TK" in line): #I would like to start sum up after this. Read all lines that include "TK", check index[0] for matches, if match sum up. 

편집 :

이것은 내가 지금까지있는 것입니다. 나는 정렬 된 목록에 이것을하고있다. 사전에

감사

EDIT2. 사람들이 나를 이해하는 데 어려움을 겪고 있기 때문에 일부 산출물이 도움이 될 수 있습니다. 현재 변수 this 인쇄 :

Fam_c1_1  F  Extractions  02-0419 02-419TK  500  400  200000.0 
Fam_c1_1  F  Extractions  5107 5107TK 1475 447.5 660062.5 
Fam_c10_1  F  Extractions  5132 5132TK 1555 547.6 851518.0 
Fam_c100_1  M  Extractions  5843 5843TK 2605 398.6 1038353.0 
Fam_c1000_1  F  Extractions  9913 9913TK 1900 398  756200.0 
Fam_c1001_1  F  Extractions  9512 9512TK 1050 20  21000.0 

그래서이 경우에는 내가 목록을 이동하려면 코드를 싶습니다은 메모리에 모든 시간을 목록의 첫 번째 값을 가지고있다. 다음 줄과 첫 번째 값이 일치하면 x가됩니다.

+1

임시 메모리 란 무엇입니까? –

+2

..'index [0]'은 무엇입니까? 그것은 귀하의 코드에 표시되지 않습니다. 'line [0]'을 의미합니까? – kampu

+0

질문이 명확하지 않기 때문에 당신이하려는 일의 몇 가지 예를 들어 줄 수 있습니다. – interjay

답변

0

나는이 같은 STH를 사용하는 제안 것 :

with open('filename') as f: 

    def lineValue(line): 
    parts = line.split('\t') 
    return float(parts[5]) * float(parts[6]) 

    def lineKey(line): 
    parts = line.split('\t') 
    return parts[0] 

    for match, lines in groupby(
     line for line in f if "Fam" in line and "TK" in line, 
     lineKey): 
    yield sum(lineValue(line) for line in lines) 

이 일치하는 모든 값이 이미 서로를 따르고 있다는 사실에 따라이 방법을. 그렇지 않은 경우 itertools.groupby()가 도움이되지 않습니다. 그리고 물론, 라인을 두 번 분할하는 것이 가장 우아한 해결책은 아닙니다. 될 것이라고 한 번만 라인을 분할,

result = defaultdict(float) 
with open('filename') as f: 

    def lineValue(line): 
    parts = line.split('\t') 
    return float(parts[5]) * float(parts[6]) 

    def lineKey(line): 
    parts = line.split('\t') 
    return parts[0] 

    for line in f: 
    if "Fam" in line and "TK" in line: 
     result[lineKey(line)] += lineValue(line) 

그리고 다시 : 일치하는 라인이 서로를 따라하지 않을 경우

, 당신은 응답의 딕셔너리를 구축해야합니다, 다음 defaultdict 합리적인 소리 더 우아한 솔루션.

+1

나는 OP가 무엇을 요구하고 있는지 전혀 모르지만, 나는 이것이 대답하지 않는다고 확신한다. 질문이 명확 해지지 않는 한이 질문에 대답하려고 시도하는 데는별로 중요하지 않습니다. – interjay

+0

나는 이미 해결할 수있는 코드에 몇 가지 문제가 있다고 생각했습니다. 어쩌면 당신은 이것이 그가 모든 길을 가는데 도움이되지 않을 것이라고 생각할지도 모릅니다. – Alfe

+0

'this'는 현재 아무 것도하지 않습니다. 'index [0]'을 매칭함으로써 나는 groupby가하는 것을 정확히 언급하고 있었지만, 이것을 수행하는보다 우아한 방법이 있기를 바라고 있었고, 그래서 나는 즉시 읽고 쓸 수 있고 엄청난리스트를 만들지 않았다. – jester112358