python - 如何为一个dict字典进行多层级赋值?
ringa_lee
ringa_lee 2017-04-18 10:07:26
0
2
1508
ringa_lee
ringa_lee

ringa_lee

membalas semua(2)
大家讲道理

Anda boleh melaksanakan struktur ini sendiri.
Dalam contoh berikut, AutoVivification mewarisi daripada dict

class AutoVivification(dict):
    """Implementation of perl's autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value
            

Kita boleh menggunakan AutoVivification seperti ini:

item = AutoVivification()
item['20161101']["age"] = 20
item['20161102']['num'] = 30
print item

Output:

{'20161101': {'age': 20}, '20161102': {'num': 30}}

Selain itu, terdapat satu lagi kaedah pelaksanaan AutoVivification, iaitu membebankan secara langsung __missing__ kaedah ajaib dict. Anggap ia sebagai lanjutan.

class AutoVivification(dict):
    """Implementation of perl's autovivification feature."""
    def __missing__(self, key):
        value = self[key] = type(self)()
        return value
        

Satu lagi, versi selepas Python 2.5 menambah jenis collections.defaultdict, yang boleh menyesuaikan jenis dict yang lebih berskala. Dokumen
menyatakan bahawa prinsip pelaksanaan adalah untuk membebankan kaedah __missing__ terlebih dahulu. AutoVivification juga boleh dinyatakan seperti ini:

item = defaultdict(dict)  # 其实现与AutoVivification的实现完全一样
item['20161101']["age"] = 20
item['20161102']['num'] = 30
print item

defaultdict membina jenis dict yang parameter pertamanya ialah default_factory apabila __missing__ dipanggil, nilai pulangan dibina menggunakan default_factory.
Lagi contoh lalai

洪涛

Saya akan melampirkan penggunaan pakej defaultdict:

from collections import defaultdict

item = defaultdict(dict)
item['20161101']['age'] = 20
print item

Output:

defaultdict(<type 'dict'>, {'20161101': {'age': 20}})

Dengan cara ini anda boleh mencapai kesan yang diingini,

Tambahan:
defaultdict() menerima parameter lalai, yang boleh menjadi nama jenis atau mana-mana fungsi boleh panggil tanpa parameter
Ini sangat berguna

item = defaultdict(lambda:0)
print item['num']

Output:

0
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan