SORU
24 NİSAN 2010, CUMARTESİ


Bir&; dondurulmuş dict " " ne olurdu?

  • Donmuş bir set frozenset.
  • Donmuş bir liste bir demet olabilir.
  • Donmuş bir dict ne olurdu? Değişmez, hashable bir dict.

collections.namedtuple gibi bir şey olabilir sanırım ama dondurulmuş-tuşları bir dict (yarı donmuş bir dict) gibi. Değil mi?

Bir "frozendict" olmalıdır donmuş bir sözlük, keys, values, get, vb. olmalıdır ve in, for, vb destek.

CEVAP
24 NİSAN 2010, CUMARTESİ


Python yerleşik frozendict bir tip yok. Bu çok sık kullanışlı hala muhtemelen yararlı daha sık frozenset daha iyi olurdu (gerçi) olmaz çıkıyor.

Böyle bir türü için en yaygın nedeni memoizing işlevi bilinmeyen değişkenler fonksiyonlar için çağırdığında. Bir dict bu hashable bir eşdeğer saklamak için en yaygın çözüm değerleri hashable olduğu) tuple(sorted(kwargs.iteritems())) gibi bir şeydir.

Bu sıralama biraz deli olmamak bağlıdır. Python edemiyor olumlu sıralama makul bir şey burada neden olacak söz. (Ama çok fazla bir şey vaat edemem, bu yüzden bu kadar zorlama.)


Yeterince kolay bir dict gibi çok çalışan bir çeşit çöp yapabilirsin. Bir şey gibi görünebilir

import collections

class FrozenDict(collections.Mapping):
    """Don't forget the docstrings!!"""

    def __init__(self, *args, **kwargs):
        self._d = dict(*args, **kwargs)
        self._hash = None

    def __iter__(self):
        return iter(self._d)

    def __len__(self):
        return len(self._d)

    def __getitem__(self, key):
        return self._d[key]

    def __hash__(self):
        # It would have been simpler and maybe more obvious to 
        # use hash(tuple(sorted(self._d.iteritems()))) from this discussion
        # so far, but this solution is O(n). I don't know what kind of 
        # n we are going to run into, but sometimes it's hard to resist the 
        # urge to optimize when it will gain improved algorithmic performance.
        if self._hash is None:
            self._hash = 0
            for pair in self.iteritems():
                self._hash ^= hash(pair)
        return self._hash

Harika bir iş olmalı

>>> x = FrozenDict(a=1, b=2)
>>> y = FrozenDict(a=1, b=2)
>>> x is y
False
>>> x == y
True
>>> x == {'a': 1, 'b': 2}
True
>>> d = {x: 'foo'}
>>> d[y]
'foo'

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Justin Case

    Justin Case

    3 EKİM 2011
  • Roger Huffman

    Roger Huffma

    4 ŞUBAT 2007
  • The Warp Zone

    The Warp Zon

    24 AĞUSTOS 2007