2013-06-17 16 views
6

私はPythonで実装しようとしている機能が可能かどうかを知りたがっています。複数のレベルのキーと値のPython

私はCreaturesというグローバルハッシュを持っています。生物には、哺乳動物、両生類、鳥類、昆虫と呼ばれるサブハッシュが含まれています。

哺乳動物には、クジラ、ゾウと呼ばれるサブハッシュがあります。両生類には、カエル(幼虫)と呼ばれるサブハッシュがあります。鳥は、イーグル、インコと呼ばれるサブハッシュを持っています。昆虫には、トンボ、蚊と呼ばれるサブハッシュがあります。

ここでも、Eaglesには、男性、女性と呼ばれるサブハッシュがあります。

私はこれらの生き物すべての頻度をテキストファイルから数えています。たとえば、ファイルが以下の形式である場合:

Birds Eagle Female 
Mammals whales Male 
Birds Eagle Female 

I should output Creatures[Birds[Eagle[Female]]] = 2 
       Creatures[mammals[Whales[Male]]] = 1 

Pythonでは可能ですか?どのようにそれを行うことができますか?私はPythonには非常に新しく、助けてください大いに感謝しています。私は1つのレベル、すなわちkey-> valueまでの辞書しか使えません。しかしここでは、複数のキーと複数の値があります。私はこれを進める方法がわかりません。私はPython 2.6を使用しています。アドバイスをありがとう!

+1

任意のレベルの入れ子を許可する必要がありますか? – J0HN

+0

あなたはデータを "数える"か、より多くの処理を期待していますか? –

+0

@ J0HNはい、シルヴァン:カウントが良いスタートになる、後で私はより多くの処理を試みることができます。 –

答えて

2

あなただけのものを「カウント」する必要がある場合は - と、データファイルを仮定すると、「ハッシュ」のすべての必要なレベルが含まれ - トリックを行います。結果を生成

import collections 

result = collections.defaultdict(int) 

with open("beast","rt") as f: 
    for line in f: 
     hashes = line.split() 
     key = '-'.join(hashes) 
     result[key] += 1 

print result 

を:
defaultdict(<type 'int'>, {'Mammals-whales-Male': 1, 'Birds-Eagle-Female': 2})

あなたがネストされた辞書が必要な場合 - その結果の後処理が

17

辞書内のキーに割り当てられた値は、それ自体は、明示的にかかわらず、各辞書を作成する必要があり、別の辞書

creatures = dict() 
creatures['birds'] = dict() 
creatures['birds']['eagle'] = dict() 
creatures['birds']['eagle']['female'] = 0 
creatures['birds']['eagle']['female'] += 1 

することができます。 Perlとは異なり、割り当てられていないキーの値をそのまま扱うと、Pythonは辞書を自動的に作成しません。

が、場合を除き、もちろん、あなたが defaultdict使用:ネストの任意のレベルのために

from collections import defaultdict 
creatures = defaultdict(lambda: defaultdict(lambda: defaultdict(int))) 
creatures['birds']['eagle']['female'] += 1 

を、あなたはこの場合、この再帰的な定義

dd = defaultdict(lambda: dd) 
creatures = dd() 
creatures['birds']['eagle']['female'] = 0 

を使用することができ、あなたが明示的に初期化する必要がありますかそうでなければcreatures['birds']['eagle']['female']の値は別のdefaultdictであると仮定されるので、整数値。

+0

鳥、動物などは単なる例であり、実際の記入項目ではありません。実際には、ファイルから読み込んで自動的に追加する必要があります –

1

エレガントな、しかし、動作していない...まだ可能です:

result = {} 
for line in input_file.split("\n"): 
    curdict = result 
    values = line.split(" ") 
    for item in values[:-1]: 
     if item not in curdict: 
      curdict[item] = {} 
     curdict = curdict[item] 
    last_item = values[-1] 
    if last_item not in curdict: 
     curdict[last_item] = 0 
    curdict[last_item] += 1 

これはおそらくより洗練された方法で記述できますが、少なくとも同じ「エンティティ」(たとえば、「エンティティ」)のネストレベルが異なる場合を除き、任意のネストレベルで動作します。 Birds Eagle FemaleおよびBirds Eagleは機能しません)

関連する問題