2

私は朝、同様の質問/回答を読んで過ごしました (ネストされた辞書を実装する最良の方法は何ですか?Python で複数のレベルのキーと値を使用するPython: ネストされた辞書でキーと値のペアの値を更新する方法は? ) しかし、私はまだ問題を解決できません。

タプルをキーとしてこのタブ辞書があり、値として整数、辞書、別の辞書、およびいくつかのリストが必要です。次に、すべてのキーについて、次のようにします: (str,str,str,str):{int, {}, {}, [], [] ...}

これらの値の構造を更新できるようにしたいのですが、defaultdict が必要です。なぜなら、すべてのキーがわからず、手動で 1 つずつ宣言するには多すぎるためです。

このように (str,str,str,str):{int} のような構造に対してこれを行うことができます:

tab=defaultdict(lambda: defaultdict(int))

tab[key][0]+=1

または、次のような構造 (str,str,str,str):{{}, {}} の場合:

tab=defaultdict(lambda: defaultdict(lambda: defaultdict(int)))

tab[key][1][str]+=1

tab[key][2][str]+=1

しかし、私が本当に必要としているものではありません。ありがとうございました!

わかりました、@RemcoGerlichに感謝します問題を解決しようとしていますが、以前にクラスを使用したことがなく、コードにまだ何か問題がある可能性があります...ところで、intはカウンターであり、2つの辞書にはキーのようなIPアドレスがあり、値としての出現回数。

class flux(object):
    def __init__(self, count_flux=0, ip_c_dict=None, ip_s_dict=None):
        self.count_flux = count_flux
        self.ip_c_dict = ip_c_dict if ip_c_dict is not None else {}
        self.ip_s_dict = ip_s_dict if ip_s_dict is not None else {}

def log_to_dict(dir_file,dictionary):
    f = gzip.open(dir_file,'r')
    for line in f:
        line = line.strip('\n')
        if not line: break
        elements = line.split(" ")
        key=elements[40],elements[18],elements[41],elements[37]
        dictionary[key].count_flux+=1
        dictionary[key].ip_c_dict[elements[0]]+=1
        dictionary[key].ip_s_dict[elements[19]]+=1

###Main
tab=defaultdict(flux)

log_to_dict('/home/-/-.txt',tab)
4

1 に答える 1

4

私はあなたの値のクラスを作成しますが、明らかに複雑です。

class YourClass(object):
    def __init__(self, anint=0, adict=None, anotherdict=None, somelists=None):
        self.anint = anint
        self.adict = adict if adict is not None else {}
        self.anotherdict = anotherdict if anotherdict is not None else {}
        self.somelists = somelists if somelists is not None else []

({} または [] をデフォルトの引数として使用しないでください。すべてのインスタンス間で共有されます)。

次に、defaultdict(YourClass) を使用して、tab[key].anotherdict[str] などを設定することもできます ...

于 2013-12-12T13:13:08.857 に答える