分析CSV文件
问题描述:
更新字典我有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
什么更好的办法?或者我从一开始就错误地做这件事?
答
怎么样:
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())
答
这是我想出了,但我不禁感到有一种更优雅的方式来做到这一点这是现在躲避我要.. :)
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))
答
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})})
美。最初的结构更好。谢谢 – theta 2012-03-16 09:37:25