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

  • JonnyEthco

    JonnyEthco

    5 EKİM 2006
  • Smith Micro Graphics

    Smith Micro

    15 Mayıs 2008
  • Tips On Linux

    Tips On Linu

    26 Temmuz 2008