1

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

正如我试图在这里解释的那样,我正在导入一个 .csv 文件,并且我想为 .csv 文件中的每一行创建我的类 Person() 的实例,另外我希望能够使用 as 直接访问这些实例key 一个唯一标识符,已经存在于 .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)

现在我有一个我的 person 实例的列表,即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 文件中,因此我已经将它作为每个人的属性。

感谢您的任何帮助,一如既往地非常感谢。另外请记住我是一个完全的python新手(你可能会说......;))

4

2 回答 2

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]) 
于 2012-05-17T16:08:50.800 回答
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
于 2012-05-17T16:47:52.757 回答