2015-01-20 97 views
0

我使用此代码打印非数字单元格的出现次数。但是,这个数字增加了一倍。它的印刷6 3.Defaultdict计数器计算两次Python

的样本数据:

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 2015-01-20 21:49:05

+0

@kindall我想只打印“ABCD”的计数,它应该是3.它只打印'ABCD',但计数是6. – abn 2015-01-20 21:52:15

+0

再次,请张贴您获得的输出。 – kindall 2015-01-20 21:53:05

回答

3

所以:

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

返回了各行中的数字列,数量在你的情况下,两个,COLS dID ANS nID是数字。

所以row_val是这个触发的所有行的整数2。

LN 14 header_counter[header].update({val: row_val})

row_val(2)每一次加入。

+4

这可以通过使用'any )'而不是'sum()'。 – kindall 2015-01-20 21:58:01

+0

@kindall哇,是的,比我正在考虑提议的更优雅(硬编码真正的更新电话是)。 – ThorSummoner 2015-01-20 22:00:01

+0

无需使用列表作为总和 – 2015-01-20 22:56:18

0

对于给定的输入数据和逻辑,输出ID Counter({'ABCD': 6})是正确的。

您正在汇总每个“ID”的所有数字字段并报告计数。

有对于具有的 “ABCD” 的ID的行6个总数值字段,即:

ABCD-02-01,ABCD-02-01-0002-UNK,, ,ABCD
ABCD-02-01,ABCD-02-01-0004-UNK,,,ABCD
ABCD-02-01,ABCD-02-01-0007-UNK, ,,ABCD

如果你解释你的预期结果是什么,我会更新我的答案。