0

我正在尝试检索已放入字典的对象,但每次尝试检索它时都会收到错误消息:

  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'

如果这是一个重复的问题或一个非常简单的问题,我深表歉意。我是 Python 的初学者,在决定发布之前我搜索了很长时间。

编辑:添加了 dict 的定义

4

2 回答 2

2

现在oldEntry是一个list。看起来你想改变

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

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

CSVEntry话虽如此,简单地创建一个新对象并将其附加到可能更有意义,dict[zipcode] 或者,您可以创建dict一个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类型。

于 2013-05-04T22:44:37.473 回答
0

你让自己成为一个包含列表的默认字典。当您调用 时dict[zipcode].append(entry),Python 会创建一个新列表并将您的条目插入该列表中。但是,当您这样做时oldEntry = dict[zipcode],您会获取该列表并将其视为 CSVEntry。

您应该使用普通的 dict 并像这样插入您的条目:

dict[zipcode] = entry

或将您的项目附加到条目:

dict[zipcode].append(newEntry)

a 的要点defaultdict是抽象出对现有项目的搜索。如果您对列表进行默认字典,则不应在字典中查找条目,而只需在必要时添加新条目;当你要求一个不存在的密钥时,defaultdict 会为你提供一个新的列表来玩。

于 2013-05-04T22:45:32.590 回答