SORU
11 Mart 2009, ÇARŞAMBA


Python ile iç içe sözlükler uygulamak için en iyi yolu nedir?

Aslında iç içe geçmiş bir sözlük anlamına bir veri yapısı var. Hadi Suna benziyor:

{'new jersey': {'mercer county': {'plumbers': 3,
                                  'programmers': 81},
                'middlesex county': {'programmers': 81,
                                     'salesmen': 62}},
 'new york': {'queens county': {'plumbers': 9,
                                'salesmen': 36}}}

Şimdi, bakımı ve bu oluşturmak oldukça acı verici; iğrenç üzerinden alt tabaka sözlük oluşturmak için yeni Eyalet/il/meslek her zaman blokları yakalamak/deneyin. Ayrıca, eğer tüm değerler üzerinden gitmek istiyorum eğer rahatsız edici iç içe kullanımına oluşturmak zorunda.

Ayrıca, bu tür gibi: anahtarları gibi dizilerini kullanabilirim

{('new jersey', 'mercer county', 'plumbers'): 3,
 ('new jersey', 'mercer county', 'programmers'): 81,
 ('new jersey', 'middlesex county', 'programmers'): 81,
 ('new jersey', 'middlesex county', 'salesmen'): 62,
 ('new york', 'queens county', 'plumbers'): 9,
 ('new york', 'queens county', 'salesmen'): 36}

Üzerinden yineleme yapar, bu değerleri çok basit ve doğal, ama daha fazla sözdizimsel acı için ne gibi şeyler toplamalardan ve bakıyor setlerinde sözlüğü (örneğin, eğer gitmek istiyorum devlet-by-devlet).

Temelde, bazen düz bir sözlük olarak iç içe geçmiş bir sözlük hayal etmek istiyorum, ve bazen gerçekten karmaşık bir hiyerarşi olarak düşünmek istiyorum. Tüm bir sınıf içinde bu işi yapabilirim ama birisi bunu zaten yapmış olabilir gibi görünüyor. Alternatif olarak, çok zarif bunun için bazı sözdizimsel yapılar olabilir gibi görünüyor.

Bunu nasıl daha iyi yapabilirim?

setdefault() farkındayım ama gerçekten temiz sözdizimi için yapmaz. ek: Ayrıca, oluşturduğunuz alt sözlük her hala setdefault() elle ayarlamak gerekiyor.

CEVAP
16 Mart 2009, PAZARTESİ


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

Test:

a = AutoVivification()

a[1][2][3] = 4
a[1][3][3] = 5
a[1][2]['test'] = 6

print a

Çıkış:

{1: {2: {'test': 6, 3: 4}, 3: {3: 5}}}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Menglong Tav

    Menglong Tav

    18 Temmuz 2010
  • pilslajt

    pilslajt

    20 HAZİRAN 2008
  • Vicious Computers

    Vicious Comp

    14 EKİM 2006