我有一个看起来像这样的字典:
{100002: "['Apple', 'M', 'R', '500001', 'Fruit', '90']", 100004: "['Banana', 'M', 'Y', '500001', 'Fruit', '75']"}
键是整数,值是字符串。
我有一个.csv文件,如下所示:
100001,1
100001,1
100001,2
100002,1
100002,1
100002,3
100002,3
100003,1
100003,4
100004,2
100004,3
100004,3
我想计算给定键的第二列中每个数字的出现次数,并将该计数添加到我的dict中。因此,对于此样本,100001的计数为2表示1,1表示2表示,100002计数为2表示为1,2表示3表示,100003计数为1表示1表示1表示4表示,10000表示计数为1表示10000这个.csv文件包含各种键的数据(我的dict中的键是子集),我希望将这些计数附加到我的dict中以便它可能看起来像是2和1的数量为3。像这样(为每个键添加4个新值,按顺序为1-4的数字计数。)
{100002: "['Apple', 'M', 'R', '500001', 'Fruit', '90', '2', '0', '2', '0']", 100004: "['Banana', 'M', 'Y', '500001', 'Fruit', '75', '0', '1', '2', '0']"}
这4个添加的部分是数字1-4的顺序,因此100002具有'2', '0', '2', '0'
,因为在.csv文件中有2行100002,1
但是0行{{1} }和2行100002,2
但0行100002,3
。
我的问题有两个部分。 1)如何计算一个密钥后跟一个.csv文件中1-4的数字的次数,这样我就有4个计数(1-4个数字各一个)? 2)如何将这些计数添加到我的字典中?
根据接受的答案我制作了这个。这比我想要的有点丑,但我设法完成了它的工作。
100002,4
dd = defaultdict(lambda: defaultdict(int))
with open('AgentsCorpLevel.csv') as fin:
csvin = csv.reader(fin)
for row in csvin:
if int(row[0]) in MyDict.keys():
dd[int(row[0])][row[1]] += 1
print dd
dicts = MyDict,dd
#print dicts
FullDict = {}
PartlyCleanedDict = {}
CleanedDict = {}
TwoTypeDict = {k:[d.get(k) for d in dicts] for k in {k for d in dicts for k in d}}
for key, value in TwoTypeDict.iteritems():
FullDict.setdefault((int(key)), str(value))
for key, value in FullDict.iteritems():
PartlyCleanedDict.setdefault((int(key)), value.translate(None, "[]{()\/\'\"<>").replace('}',',}'))
for key, value in PartlyCleanedDict.iteritems():
CleanedDict.setdefault((int(key)), value.replace(',defaultdicttype int', ''))
print CleanedDict
的{{1}}看起来像这样
print
不幸的是,我完全“清理”生成的CleanedDict的尝试不起作用,因为这是CleanedDict的dd
看起来像的一个例子(注意我在这里只提供3个键而且我已经改变名称以适应我的样本中的水果和蔬菜主题。
defaultdict(<function <lambda> at 0x00000000025C3518>, {1000164: defaultdict(<ty
pe 'int'>, {'1': 12, '3': 5, '2': 17, '4': 10}), 1000103: defaultdict(<type 'int
'>, {'1': 3, '3': 3, '2': 3, '4': 3}), 1000137: defaultdict(<type 'int'>, {'1':
5, '3': 4, '2': 7, '4': 1}), 1000140: defaultdict(<type 'int'>, {'1': 28, '3': 2
6, '2': 33, '4': 8}), 1000143: defaultdict(<type 'int'>, {'1': 1, '3': 3, '2': 1
, '4': 1}), 1000149: defaultdict(<type 'int'>, {'1': 6, '3': 7, '2': 9, '4': 6})
, 1000150: defaultdict(<type 'int'>, {'1': 13, '3': 11, '2': 22, '4': 12}), 1000
132: defaultdict(<type 'int'>, {'1': 2, '3': 4, '2': 4, '4': 1}), 1000155: defau
ltdict(<type 'int'>, {'1': 10, '3': 4, '2': 2, '4': 3}), 1000158: defaultdict(<t
ype 'int'>, {'1': 6, '3': 1, '2': 7, '4': 5})})
答案 0 :(得分:1)
您可以使用嵌套的defaultdict
- 我将保留微调和处理超过4个值以及确切的格式等...给您...
import csv
from collections import defaultdict
d = {100002: "['Apple', 'M', 'R', '500001', 'Fruit', '90']", 100004: "['Banana', 'M', 'Y', '500001', 'Fruit', '75']"}
dd = defaultdict(lambda: defaultdict(int))
with open('test.csv') as fin:
csvin = csv.reader(fin)
for row in csvin:
dd[int(row[0])][row[1]] += 1
for key in (key for key in dd if key in d):
counts = [0] * 4
for idx, val in dd[key].iteritems():
counts[int(idx) - 1] = int(val)
print key, d[key], counts
# 100002 ['Apple', 'M', 'R', '500001', 'Fruit', '90'] [2, 0, 2, 0]
# 100004 ['Banana', 'M', 'Y', '500001', 'Fruit', '75'] [0, 1, 2, 0]