2015-01-20 1 views
0

이 코드를 사용하여 숫자가 아닌 셀을 인쇄하고 있습니다. 그러나이 수치는 두 배가됩니다. 3.기본값으로 계산되는 카운터 기본값이 파이썬

샘플 데이터에 대한 인쇄 6 :

pID,sID,dID,nID,ID 
ABCD-02-01,ABCD-02-01-0002-UNK,2,123,ABCD 
ABCD-02-01,ABCD-02-01-0004-UNK,3,1234,ABCD 
ABCD-02-01,ABCD-02-01-0007-UNK,7,3455,ABCD 

코드 :

#!/usr/bin/env python 
from collections import Counter, defaultdict 
import csv 

header_counter = defaultdict(Counter) 

with open('trial.csv') as input_file: 
    r = csv.reader(input_file, delimiter=',') 
    headers = next(r) 
    for row in r: 
     row_val = sum([w.isdigit() for w in row]) 
     for header, val in zip(headers, row): 
      if not any(map(str.isdigit, val)): 
       header_counter[header].update({val: row_val}) 

for k, v in header_counter.iteritems(): 
    print k,v 

전류 출력 ID Counter({'ABCD': 6}) 원하는 출력 ID Counter({'ABCD': 3})

+0

예상되는 출력과 예상되는 결과는 무엇입니까? – kindall

+0

@kindall 'ABCD'의 수를 인쇄하고 3이어야합니다. 'ABCD'만 인쇄하지만 수는 6입니다. – abn

+0

다시 출력하십시오. – kindall

답변

3

:

sum([w.isdigit() for w in row])

11 ln를하는 것은 COLS에게, 귀하의 경우 두 dID ANS nID가 자리 수를 각 행의 자리입니다 열 수를 반환합니다.

따라서 row_val은이 트리거에 대한 모든 행에 대해 정수 2입니다.

14 속에는 header_counter[header].update({val: row_val})

row_val (2)마다 부가된다.

+4

이것은')'대신'sum()'을 사용한다. – kindall

+0

@kindall Wow yeah, 제안하는 것보다 더 우아합니다 (업데이트 호출이있는 곳에서 하드 코딩). – ThorSummoner

+0

합계에 대한 목록을 사용할 필요가 없습니다. –

0

출력 ID Counter({'ABCD': 6})은 주어진 입력 데이터와 로직에 대해 정확합니다.

각 "ID"에 대한 모든 숫자 필드를 합하여 계산합니다.

"ABCD"의 ID를 행 6 총 숫자 필드, 즉있다 :

ABCD-02-01, ABCD-02-01-0002-UNK, 2, 123 , ABCD
ABCD-02-01, ABCD-02-01-0004-UNK, 3, 1,234, ABCD
ABCD-02-01, ABCD-02-01-0007-UNK, 7 , , ABCD

의도 한 결과가 무엇인지 설명하면 답변을 업데이트하겠습니다.