2012-05-17 69 views
1

我需要一種通過ID號直接訪問類實例的方法。如何通過Python中的類字典直接訪問類實例

正如我試圖解釋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()剛剛模塊:

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」。 請記住,我需要多次直接訪問,所以我需要一個非常有效的方式來執行此操作,而不是在列表中搜索某種形式(同時考慮到我的人口中有大約15萬人)。

在我的Person類Person()中實現類似字典特性的東西真是太好了,每個實例的鍵都是唯一標識符。這個唯一的標識符已經存在於我的csv文件中,因此我已經將它作爲每個人的屬性。

非常感謝您的幫助,我們將不勝感激。也請記住我是一個總的python新手(你可能會說...;))

+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]) 
+2

另一個選擇是直接創建該字典,而不是generateAgents函數中的列表 – Toote

+0

謝謝!這非常簡單!我愛蟒蛇! :) @Toote:是的,它會更有效率(你可以建議一種方法來做到這一點?) – Wilco

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 
相關問題