2011-01-10 11 views
1

入れ子にされたディクテーションの賛否両論はPythonでタプルをハッシュするのと比べてどうでしょうか?Python - ネストしたdictとタプルをハッシュする

コンテキストは、会議の出席者に「ワークショップ」を割り当てる小さなスクリプトです。

各ワークショップには、いくつかの属性(週、日、件名など)があります。私たちは、各出席者にワークショップを割り当てるためにこれらの属性の4を使用する - すなわち、各代表はまた、私は私のワークショップを保存するために、ネストされた辞書を使用しています、週/日/件名など現在

を持っています:

workshops = defaultdict(lambda: defaultdict(lambda:defaultdict(lambda:defaultdict(dict)))) 

with open(input_filename) as input_file: 
    workshop_reader = csv.DictReader(input_file, dialect='excel') 

    for row in workshop_reader: 
     workshops[row['Week ']][row['Stream']][row['Strand']][row['Day']] = row 

return workshops 

私は上記のデータ構造を使用して、各出席者に自分のワークショップを割り当てることができます。

問題は後で、すべてのワークショップを繰り返してID(このIDは別のシステムに格納されています)を割り当てる必要があります。このためには、レイヤーごとに構造をアンラップする必要があります。

最初の質問 - 文字列(ワークショップ名)をキーとして2番目のインデックスを同じ値に作成する方法はありますか?私。私はまだ4つのレベルのネストされた辞書を持っていますが、名前だけに基づいて個々のエントリを検索することもできます。

第2に、タプルをキーとして同様の効果を得るにはどうすればよいですか?このアプローチを使用すると、あなたが考えることができる利点はありますか?はるかにクリーンな、または使いやすいだろうか? (この全体をアンラッピングすることは少し痛みですが、私はそれがとても親切ではないと思います)。

また、アクセス/操作が優れている/簡単になる可能性がある他のデータ構造もありますか?

おかげで、名前はワークショップのユニークな属性(つまり、名前を繰り返すとはワークショップではありません)である場合にのみある ビクター

答えて

7
class Workshop(object): 
    def __init__(self, week, stream, strand, day, name): 
    self.week = week 
    self.stream = stream 
    self.day = day 
    self.strand = strand 
    self.name = name 

... 
for row in workshop_reader: 
    workshops['name'] = Workshop(...) 


また、ワークショップ辞書の各WorkshopオブジェクトにIDを簡単に割り当てることができます。

+1

名前付きタプルは単にデータなので使用しない方がいいですか? –

+0

ええと、それは良い点です。私はそれを考えていたはずです...笑。 そして、私はちょうどクイックルックアップを容易にするために、ワークショップの辞表を作成することができますか?しかし、どのように階層を横断するのですか?たとえば、第1層のすべてのワークショップを取得するために最初のレイヤーに移動する前に、次のレイヤーを展開して1週目のすべてのワークショップを取得します。クラス1を使用してナビゲーションを実行することはできますか? – victorhooi

+0

基本的には、クラスベースの場合、週間/ストランド/ストリームがクラス内のインスタンス属性であると仮定して、特定の週/ストランド/ストリームのすべてのワークショップをリストする簡単な方法はありますか? – victorhooi

3

通常、辞書をネストする必要がある場合は、代わりにクラスを使用する必要があります。ネストされた辞書は、デバッグしているときを把握するために複雑になります。クラスを使用すると、さまざまなタイプのディクショナリを区別できるので、簡単になります。 :)

+0

クラスでは、どうやって階層を下ろすことができないのか分かりません。ネストされたDictsでは、最初のレイヤーをアンラップして1週目のワークショップをすべて終了し、その中の1つのディクテーションをアンラップして、私はクラスワークショップでそれをどうやって行うことができるのか分かりません。...うーん... – victorhooi

+0

@victorhooi:あなたは属性アクセスで下降します。だから、adict ['foo'] = {}の代わりにanobject.foo = anotehrobject() –

+0

@Lennart Regebro:うーん、私はこれらをどのように保存するのか考え直さなくてはならないと思う。 「週」には「ワークショップ」のリストが保存されるのではなく、各ストリームについてdict(?)またはその他のコレクションが保存されます。各ストリームには、各ストランドの別のコレクションがあります。それでは、実際のワークショップに参加します。クラスWeek、クラスStream、クラスStrandを作成するか、それとも良い方法がありますか? – victorhooi

関連する問題