Kelas memiliki konstruktor yang mengambil satu parameter:
class C(object):
def __init__(self, v):
self.v = v
...
Di suatu tempat di kode, ini berguna untuk nilai-nilai dalam sebuah dict untuk mengetahui kuncinya.
Saya ingin menggunakan defaultdict dengan kunci yang diteruskan ke nilai default baru lahir:
d = defaultdict(lambda : C(here_i_wish_the_key_to_be))
Ada saran?
python
dictionary
defaultdict
Benjamin Nitlehoo
sumber
sumber
defaultdict
's__missing__()
metode dapat ditimpa (karena dapat di setiap subclass dari built-indict
kelas sejak versi 2.5).Tidak, tidak ada.
The
defaultdict
implementasi tidak dapat dikonfigurasi untuk lulus hilangkey
dengandefault_factory
out-of-the-box. Satu-satunya pilihan Anda adalah menerapkandefaultdict
subkelas Anda sendiri , seperti yang disarankan oleh @JochenRitzel, di atas.Tapi itu tidak "pintar" atau hampir sebersih solusi perpustakaan standar (jika ada). Jadi jawaban singkat Anda, pertanyaan ya / tidak jelas "Tidak".
Sayang sekali perpustakaan standar kehilangan alat yang sering dibutuhkan.
sumber
Saya tidak berpikir Anda perlu
defaultdict
di sini sama sekali. Mengapa tidak menggunakandict.setdefault
metode saja?>>> d = {} >>> d.setdefault('p', C('p')).v 'p'
Itu tentu saja akan menciptakan banyak contoh
C
. Jika itu adalah masalah, saya pikir pendekatan yang lebih sederhana akan dilakukan:>>> d = {} >>> if 'e' not in d: d['e'] = C('e')
Ini akan lebih cepat dari pada
defaultdict
atau alternatif lain sejauh yang saya bisa lihat.ETA terkait kecepatan
in
pengujian vs. menggunakan klausul coba-kecuali:>>> def g(): d = {} if 'a' in d: return d['a'] >>> timeit.timeit(g) 0.19638929363557622 >>> def f(): d = {} try: return d['a'] except KeyError: return >>> timeit.timeit(f) 0.6167065411074759 >>> def k(): d = {'a': 2} if 'a' in d: return d['a'] >>> timeit.timeit(k) 0.30074866358404506 >>> def p(): d = {'a': 2} try: return d['a'] except KeyError: return >>> timeit.timeit(p) 0.28588609450770264
sumber
d[key]
untuk kembalid[key] = C(key)
jikakey not in d
. Tetapi solusi Anda mengharuskan dia untuk benar-benar pergi dan mengaturd[key]
sebelumnya? Bagaimana dia tahu mana yangkey
dia butuhkan?Berikut adalah contoh kerja kamus yang secara otomatis menambahkan nilai. Tugas demonstrasi dalam menemukan file duplikat di / usr / include. Perhatikan kamus kustomisasi PathDict hanya membutuhkan empat baris:
class FullPaths: def __init__(self,filename): self.filename = filename self.paths = set() def record_path(self,path): self.paths.add(path) class PathDict(dict): def __missing__(self, key): ret = self[key] = FullPaths(key) return ret if __name__ == "__main__": pathdict = PathDict() for root, _, files in os.walk('/usr/include'): for f in files: path = os.path.join(root,f) pathdict[f].record_path(path) for fullpath in pathdict.values(): if len(fullpath.paths) > 1: print("{} located in {}".format(fullpath.filename,','.join(fullpath.paths)))
sumber