如何通过Python中的类字典直接访问类实例

时间:2012-05-17 16:06:29

标签: python oop agent-based-modeling

我需要一种通过ID号直接访问类实例的方法。

当我尝试解释here时,我正在导入.csv文件,我想为.csv文件中的每一行创建我的类Person()的实例,而且我希望能够使用已存在于.csv文件中的唯一标识符作为密钥直接访问这些实例。

到目前为止,由于user433831的帮助,我所做的是:

from sys import argv
from csv import DictReader
from person import Person

def generateAgents(filename):
  reader = DictReader(open(filename, 'rU'))
  persons = [Person(**entry) for entry in reader]
  return persons

其中person只是我将类Person()定义为:

的模块
class Person:
  def __init__(self, **kwds):
    self.__dict__.update(kwds)

现在我有一个我的人物实例列表,即persons,它已经很整洁了。 但现在我需要使用networkx模块在​​这些人之间创建一个网络,我绝对需要一种直接访问每个人的方法(目前我的实例没有任何名称)。

例如,每个人都有一个名为“father_id”的属性,它是父亲的唯一ID。在当前人口中没有父亲的人的“father_id”等于“-1”。

现在,要将每个人与他/她的父亲联系起来,我会做类似的事情:

import networkx as nx 
G=nx.Graph() 
for person in persons: 
  G.add_edge(person, person_with_id_equal_to_father_id) 

我的问题是我无法直接访问此“person_with_id_equal_to_father_id”。 请记住,我需要多次直接访问,所以我需要一种非常有效的方法,而不是在列表中进行某种形式的搜索(也考虑到我的人口中有大约150000人)

在我的Person()类中实现类似字典功能的东西会很棒,每个实例的键都是唯一的标识符。这个唯一标识符已存在于我的csv文件中,因此我已将其作为每个人的属性。

感谢您的帮助,我们非常感谢。另外请记住,我是一个完整的蟒蛇新手(你可能会告诉...;))

2 个答案:

答案 0 :(得分:3)

只需使用字典:

persons_by_id = {p.id: p for p in persons}

这需要最新版本的Python。如果您的语法不支持此语法,请使用以下命令:

persons_by_id = dict((p.id, p) for p in persons)

完成上述任一操作后,您可以通过ID识别此人:

persons_by_id[id]

networkx示例变为:

import networkx as nx 
G=nx.Graph() 
for person in persons: 
  if person.father_id != -1:
    G.add_edge(person, persons_by_id[person.father_id]) 

答案 1 :(得分:0)

这是@Toote建议的有效方式:

def generateAgents(filename):
  with open(filename, 'rU') as input:
    reader = DictReader(input)
    persons = dict((entry['father_id'], Person(**entry)) for entry in reader)
  return persons