我需要一种通过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文件中,因此我已将其作为每个人的属性。
感谢您的帮助,我们非常感谢。另外请记住,我是一个完整的蟒蛇新手(你可能会告诉...;))
答案 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