Defaultdict 计数器计数两次 Python
Defaultdict counter counting twice Python
我正在使用此代码打印出现的非数字单元格。但是,它正在加倍计数。它打印 6 for 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})
我认为您的问题在于您如何对计数器使用更新,因为 update() 会增加计数,而不是像您对传统字典所期望的那样替换它。参见:https://docs.python.org/2/library/collections.html#collections.Counter
所以:
ln 11sum([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)。
对于给定的输入数据和逻辑,输出 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
如果你解释一下你的预期结果是什么,我会更新我的答案。
我正在使用此代码打印出现的非数字单元格。但是,它正在加倍计数。它打印 6 for 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})
我认为您的问题在于您如何对计数器使用更新,因为 update() 会增加计数,而不是像您对传统字典所期望的那样替换它。参见:https://docs.python.org/2/library/collections.html#collections.Counter
所以:
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)。
对于给定的输入数据和逻辑,输出 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
如果你解释一下你的预期结果是什么,我会更新我的答案。