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
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'
Nasıl bir liste tuşları ile bir dict b...
Bir dict anahtarları olarak ayrılmış a...
Dict anlayış.() kopya sığ ya da derin?...
Python yeni bir dict oluşturma...
Python: Nasıl "mükemmel" bir...