如何从Python字典中检索对象

2024-09-29 01:36:50 发布

您现在位置: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], 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)

它在字典中插入条目没有问题,但一旦发现重复项,就会失败,并出现以下错误:

^{pr2}$

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

编辑:增加了dict的定义


Tags: thedictionarycount错误dictrowlonzipcode
2条回答

{cd2>现在是。看起来你想改变

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

^{pr2}$

这就是说,简单地创建一个新的CSVEntry对象并将其附加到dict[zipcode]或者,可以创建包含CSVEntry对象的dict一个defaultdict对象,这意味着您不必检查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类型。在

你给自己做了一个包含列表的defaultdict。当您调用dict[zipcode].append(entry)时,Python会创建一个新的列表,您可以在该列表中插入条目。然而,当你做oldEntry = dict[zipcode]时,你会把这个列表当作一个CSVEntry来对待。在

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

dict[zipcode] = entry

或将项目附加到条目:

^{pr2}$

defaultdict的重点是抽象出对现有项的搜索。如果对列表进行defaultdict,则不应在字典中查找条目,而只需在必要时追加新条目;当您请求不存在的键时,defaultdict将负责为您提供一个新列表以供使用。在

相关问题 更多 >