dict.setdefault 将一个额外的(默认?)项目附加到值列表中
dict.setdefault appends one extra (default?) item into the value list
我正在使用字典对 CSV 文件中的数据进行分组,因此例如第一列和第二列是字典键,值将是包含第 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) 添加到 dictionary/key。
当你这样做时
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
returns对应的值是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):
....
这样您就不必担心明确关闭文件。
我正在使用字典对 CSV 文件中的数据进行分组,因此例如第一列和第二列是字典键,值将是包含第 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) 添加到 dictionary/key。
当你这样做时
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
returns对应的值是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):
....
这样您就不必担心明确关闭文件。