Python 解析CSV文件时更新字典

Python 解析CSV文件时更新字典,python,csv,Python,Csv,我有如下csv文件: item,#RGB item1,#ffcc00 item1,#ffcc00 item1,#ff00cc item2,#00ffcc item2,#ffcc00 item2,#ffcc00 item2,#ffcc00 .... 我想制作dictionaryd,以项名称作为键,以RGB值和列表中的元组计数作为dictionary值,如下所示: d[item] = [ (#RGB, count) ] 对于示例中的“item1”,我想得到: d['item1'] = [ ('#

我有如下csv文件:

item,#RGB
item1,#ffcc00
item1,#ffcc00
item1,#ff00cc
item2,#00ffcc
item2,#ffcc00
item2,#ffcc00
item2,#ffcc00
....
我想制作dictionary
d
,以项名称作为键,以RGB值和列表中的元组计数作为dictionary值,如下所示:

d[item] = [ (#RGB, count) ]
对于示例中的“item1”,我想得到:

d['item1'] = [ ('#ffcc00', 2), ('#ff00cc', 1) ]
我想象一些Pythonic迭代器可以在一行中完成这项工作,但我现在不明白怎么做。到目前为止,我已经做到了:

d={}
with open('data.csv', 'rb') as f:
    reader = csv.reader(f)
    try:
        for row in reader:
            try:
                if d[(row[0], row[1])]:
                    i +=1
            except KeyError:
                i = 1
            d[(row[0], row[1])] = i
    except csv.Error, e:
        sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))
这给了我:

d[(item, #RGB)] = count
还有更好的办法吗?还是我从一开始就做错了?

那么:

a = {}

for row in reader:
    a.setdefault(row[0], {}).setdefault(row[1], 0)
    a[row[0]][row[1]] += 1
这将创建一个类似于

 {'item2': {'#00ffcc': 1, '#ffcc00': 3}, 
  'item1': {'#ffcc00': 2, '#ff00cc': 1}}
我发现它比您的结构更方便,但如果需要,您可以将其转换为元组:

 b = dict((k, v.items()) for k, v in a.items())
印刷品

defaultdict(<class 'collections.Counter'>, {'item2': Counter({'#ffcc00': 3, '#00ffcc': 1}), 'item1': Counter({'#ffcc00': 2, '#ff00cc': 1})})
defaultdict(,{'item2':计数器({'ffcc00':3','00ffcc':1}),'item1':计数器({'ffcc00':2','ff00cc':1})

美丽。甚至比最初更好的结构。谢谢
defaultdict(<class 'collections.Counter'>, {'item2': Counter({'#ffcc00': 3, '#00ffcc': 1}), 'item1': Counter({'#ffcc00': 2, '#ff00cc': 1})})