【问题标题】:dict.setdefault appends one extra (default?) item into the value listdict.setdefault 将一个额外的(默认?)项目附加到值列表中
【发布时间】: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


【解决方案1】:

第一次这样做

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):
        ....

这样您就不必担心显式关闭文件。

【讨论】:

    【解决方案2】:

    当你这样做时

    csvDicData_.setdefault(key,[value]).append(value)
    

    您将列表初始化为[value],如果缺少,然后将value 附加到它,给您[value, value]。你想要的是用一个空列表进行初始化:

    csvDicData_.setdefault(key,[]).append(value)
    

    或使用collections.defaultdict(list) 就可以了

    csvDicData_[key].append(value)
    

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2021-07-07
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      • 2019-03-13
      相关资源
      最近更新 更多