2012-03-16 41 views
0

更新字典我有CSV文件是這樣的:分析CSV文件

item,#RGB 
item1,#ffcc00 
item1,#ffcc00 
item1,#ff00cc 
item2,#00ffcc 
item2,#ffcc00 
item2,#ffcc00 
item2,#ffcc00 
.... 

,我想讓字典d,以項目名作爲關鍵字和RGB值和計數在列表中的元組作爲字典值,如:

d[item] = [ (#RGB, count) ] 

所以對於 「物品1」 的例子,我想獲得:

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 

什麼更好的辦法?或者我從一開始就錯誤地做這件事?

回答

2

怎麼樣:

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

字典我覺得比你的結構更方便,但你可以將其轉換爲tupl如果需要的話ES:

b = dict((k, v.items()) for k, v in a.items()) 
+0

美。最初的結構更好。謝謝 – theta 2012-03-16 09:37:25

0

這是我想出了,但我不禁感到有一種更優雅的方式來做到這一點這是現在躲避我要.. :)

import csv 
import collections 
with open('data.csv') as f: 
    counter = collections.Counter((d['item'], d['#RGB']) for d in csv.DictReader(f)) 
d = collections.defaultdict(list) 
for t,c in counter.iteritems(): 
    d[t[0]].append((t[1], c)) 
0
import csv 
from collections import defaultdict, Counter 
from itertools import islice 

with open('infile.txt') as f: 
    d=defaultdict(Counter) 
    for k,v in islice(csv.reader(f),1,None): 
     d[k].update((v,)) 

print d 

打印

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