3

我有一个包含两列的 CSV,第一列是我们项目中致力于特定建筑的团队。

第二列是实际的建筑编号。

我正在寻找的是一个字典,其中第一列作为键,列表中属于该团队的建筑物。

我尝试了各种形式的csv.reader以及csv.DictReader不同的 for 循环来将数据重写到另一个字典,但我无法获得我想要的结构。

CSV:

team,bldg,
3,204,
3,250,
3,1437,
2,1440,
1,1450,

字典的结构如下:

dict["1"] = ["1450"]
dict["2"] = ["1440"]
dict["3"] = ["204", "250", "1437"]
4

2 回答 2

5

这有效:

import csv

result={}
with open('/tmp/test.csv','r') as f:
    red=csv.DictReader(f)
    for d in red:
        result.setdefault(d['team'],[]).append(d['bldg'])

#results={'1': ['1450'], '3': ['204', '250', '1437'], '2': ['1440']}
于 2013-07-25T23:12:50.130 回答
2

标准库中的有用collections.defaultdict使这项任务的工作变得很短:

import csv
import collections as co

dd = co.defaultdict(list)
with open('/path/to/your.csv'),'rb') as fin:
    dr = csv.DictReader(fin)
    for line in dr:
        dd[line['team']].append(line['bldg'])

# defaultdict(<type 'list'>, {'1': ['1450'], '3': ['204', '250', '1437'], '2': ['1440']})

http://docs.python.org/2/library/collections.html#collections.defaultdict

第一个参数提供default_factory 属性的初始值;它默认为None.

于 2013-07-25T22:49:03.077 回答