[英]dict.setdefault appends one extra (default?) item into the value list
我正在使用字典对CSV文件中的数据进行分组,因此,例如,拳头和第二列是dict键,值将是具有3,4列的元组列表。
我的代码段是:
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)添加到字典/键中。
当你做
csvDicData_.setdefault(key,[value]).append(value)
您可以将列表初始化为[value]
(如果缺少),然后将value
附加到列表中,从而得到[value, value]
。 相反,您要使用一个空列表进行初始化:
csvDicData_.setdefault(key,[]).append(value)
或使用collections.defaultdict(list)
并执行
csvDicData_[key].append(value)
第一次做
csvDicData_.setdefault(key,[value]).append(value)
该key
将不在字典中,因此将使用[value]
值创建键。 现在, setdefault
返回与key
对应的值。 因此,将返回[value]
,并且您要向其value
。 这就是为什么您总是得到一个额外的元素。
这本来应该
csvDicData_.setdefault(key, []).append(value)
现在,将返回空列表,您将为其添加value
。
除此之外,您可能希望使用with
语句打开文件,如下所示
with open('myfile.csv', 'rt') as fh:
reader = csv.reader(fh, delimiter=';', skipinitialspace=True)
for indx, row in enumerate(reader):
....
这样您就不必担心显式关闭文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.