如何从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
adefaultdict
包含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)