1

ID 番号を介してクラスのインスタンスに直接アクセスする方法が必要です。

ここで説明しようとしたように、.csv ファイルをインポートしていて、.csv ファイルのすべての行に対してクラス Person() のインスタンスを作成したいのに加えて、これらのインスタンスに直接アクセスできるようにしたい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)

これで、個人インスタンスのリスト、つまりpersonsができました。これは、すでにきちんとしています。しかし今、networkxモジュールを使用して、これらの人々の間でネットワークを作成する必要があり、すべての人に直接アクセスする方法が絶対に必要です (現在、私のインスタンスには名前がありません)。

たとえば、すべての人は、父親の一意の ID である「father_id」という属性を持っています。現在の集団で父親が生存していない人は、「-1」に等しい「father_id」を持っています。

さて、すべての人を父親に結び付けるには、次のようにします。

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」に直接アクセスできないことです。この直接アクセスを何度も行う必要があることを覚えておいてください。そのため、リスト内で検索する形式ではなく、かなり効率的な方法が必要になります (人口に約 150,000 人いることも考慮してください)。 .

私のクラス 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 に答える