Defaultdict计数器计数两次​​Python

时间:2015-01-20 21:33:18

标签: python csv counter defaultdict

我正在使用此代码来打印非数字单元格的出现。然而,它的数量增加了一倍。它的印刷6为3。

示例数据:

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})

3 个答案:

答案 0 :(得分:3)

所以:

  

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

返回每行中数字的列数,在您的情况下为2,cols dID ans nID为数字。

因此row_val对于触发的所有行都是整数2。

  

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

每次都添加row_val(2)。

答案 1 :(得分:0)

我希望您的问题在于如何对计数器使用更新,因为update()会增加计数,而不是像传统的dict那样替换它。请参阅:https://docs.python.org/2/library/collections.html#collections.Counter

答案 2 :(得分:0)

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

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

ID为“ABCD”的行共有6个数字字段,即:

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

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