如何从Python字典中检索对象

如何从Python字典中检索对象,python,Python,我试图检索已放入词典的对象,但每次检索时都会收到一个错误: class CSVEntry: lat = [] lon = [] count = 0 # Create dictionary for tracking inputs dict = defaultdict(list) # Lookup the zipcode (returns an integer value) zipcode = ConvertLatLonToZip(row[latCol

我试图检索已放入词典的对象,但每次检索时都会收到一个错误:

  class CSVEntry:
    lat = []
    lon = []
    count = 0

  # Create dictionary for tracking inputs
  dict = defaultdict(list)

  # Lookup the zipcode (returns an integer value)
  zipcode = ConvertLatLonToZip(row[latCol], row[lonCol])

  # If the zipcode is already in the dictionary, update it with the new count
  if zipcode in dict:
    oldEntry = dict[zipcode]
    oldEntry.lat.append(row[latCol])
    oldEntry.lon.append(row[lonCol])
    oldEntry.count = dict[zipcode].count + 1

  # Otherwise, make a new entry
  else:
    entry = CSVEntry()
    entry.lat.append(row[latCol])
    entry.lon.append(row[lonCol])
    entry.count = 1

    # Hash on the zipcode
    dict[zipcode].append(entry)
将条目插入词典没有问题,但一旦发现重复条目,就会失败,并出现以下错误:

Traceback (most recent call last):
  File "ParseCSV.py", line 125, in <module>
    oldEntry.lat.append(row[latCol])
AttributeError: 'list' object has no attribute 'lat'
回溯(最近一次呼叫最后一次):
文件“ParseCSV.py”,第125行,在
oldEntry.lat.append(行[latCol])
AttributeError:“list”对象没有属性“lat”
如果这是一个重复的问题或是一个可笑的简单问题,我道歉。我是Python的初学者,在决定发布之前,我搜索了很长时间


编辑:现在添加了dict的定义
oldEntry
是一个
列表
。看起来你想要改变

if zipcode in dict:
    oldEntry = dict[zipcode]
    oldEntry.lat.append(row[latCol])
    oldEntry.lon.append(row[lonCol])
    oldEntry.count = dict[zipcode].count + 1

也就是说,创建一个新的
CSVEntry
对象并将其附加到
dict[zipcode]
可能更有意义。或者,您可以创建一个
dict
a
defaultdict
包含
CSVEntry
对象,这意味着您不必检查zipcode是否在dict中。这将为您提供如下代码:

zip_dict = collections.defaultdict(CSVEntry)
zip_dict[zipcode].lat.append(row[latCol])
zip_dict[zipcode].lon.append(row[longCol])
zip_dict[zipcode].count += 1

这可能是解决问题的最简单方法。另一方面,您希望避免命名变量
dict
,因为它会覆盖内置的
dict
类型。

您创建了一个包含列表的默认dict。当您调用
dict[zipcode].append(entry)
时,Python会创建一个新列表,您可以在该列表中插入条目。但是,当您执行
oldEntry=dict[zipcode]
时,您会将该列表视为一个CSVEntry

您应该使用普通dict并插入您的条目,如下所示:

dict[zipcode] = entry
或将项目附加到条目:

dict[zipcode].append(newEntry)


defaultdict
的要点是抽象出对现有项目的搜索。如果你做了一个默认的列表,你不应该在字典中查找条目,而是在必要时添加新条目;当您请求一个不存在的密钥时,defaultdict将为您提供一个新的列表供您使用。

这里的
dict
是什么?
convertratlontozip
返回什么?dict设置为“dict=defaultdict(list)”,convertratlontozip返回一个整数zipcode值您正在做一些奇怪的事情:
dict[zipcode]。append(entry)
清楚地表明
dict[zipcode]
是一个列表。难怪
dict[zipcode].lat
会抛出一个AttributeError。非常感谢,这帮我修复了它。我需要执行dict[zipcode]=entry,而不是追加。愚蠢的错误。
dict[zipcode].append(newEntry)