【发布时间】:2016-03-10 14:11:41
【问题描述】:
我正在使用字典对 CSV 文件中的数据进行分组,因此例如第一列和第二列是 dict 键,值将是第 3,4 列的元组列表。
我的代码 sn-p 是:
import csv
import collections
csvDicData_ = dict()
fh = open('myfile.csv', 'rt')
reader = csv.reader(fh, delimiter=';', skipinitialspace=True)
for indx, row in enumerate(reader):
if row:
#-- put in a dictionary form: #csvDicData_[(row[0],row[1])] = (row[2],row[3])
key = (row[0],row[1])
value = (row[2],row[3])
#-- I'd like to use the row below (commented) insted of the next two, I expect the same result...
#csvDicData_.setdefault(key,[value]).append(value)
if (not key in csvDicData_): csvDicData_[key] = [value]
else: csvDicData_[key].append(value)
上面的代码产生了正确的结果,尽管我尝试使用csvDicData_.setdefault(key,[value]).append(value),但由于某种我不明白的原因,len(csvDicData_[('field1x','field2x')] )) 总是多了一个项目(值为 (0,0) 是预期的。
为什么会出现这种行为(就像 CSV 文件中每个键的第一行自动将元组 (0,0) 添加到字典/键中一样。
【问题讨论】:
-
setdefault(key, [value]).append(value)会将值附加到列表(如果存在),但如果不存在,则首先创建一个类似[value]的列表,然后将值附加到它。不知道为什么它总是(0,0),但你肯定会得到一个额外的条目。你想要setdefault(key, []).append(value)...顺便说一句,使用defaultdict(list)是获得类似功能的更简单方法......
标签: python dictionary setdefault