2016-03-30 17 views
1

Bir anahtarın bir yöntemdeki bir tuple eşleştirilmesi gerekiyor. Anahtar, yöntemin bir argümanıdır. Bunu yapmak için bir sözlük kullanmayı düşünüyordum. Ama sözlükteki anahtarın sabit olması gerekiyor, yöntemin argümanını anahtar olarak kullanmak tamam mı? Değilse, bunu yapmak için hangi veri yapısını kullanmalıyım?Python'da bir eşlemede anahtar olarak argüman nasıl kullanılır?

+0

Bir [jenerik memoization fonksiyonunu veya dekoratör] oluşturmak istiyor musunuz (https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize)? –

+1

Kodunuzun bir örneğini yayınlayabilir misiniz? Ve neden bunu argüman olarak kullanmıyorsunuz? .. Bunu denediniz mi ya da herhangi bir sorunla karşılaştınız mı? –

+0

Anahtarın sabit olması gerektiğinden, bir argümanın bir sabit olarak kabul edilip edilemeyeceğinden emin değilim. – CsIsFun

cevap

1

Eğer glossary bir sözlüğe tanımına bakarsak:

sözlüğe ilişkilendirilebilir bir dizi, keyfi tuşları değerlere eşlenir. Anahtarlar, __hash __() ve __eq __() yöntemleriyle herhangi bir nesne olabilir. Perl.

Sen bir sözlük anahtar için uygun terim hashable demektir şimdi ne hashable (sabit eşdeğer), olmak olduğunu anlayacaktır

:

hashable

Bir nesnesi, ömrü boyunca hiçbir zaman değişmeyen bir karma değere sahipse (karma() yöntemine) sahipse veolabilir, diğer nesnelere göre (eq() yöntemine ihtiyaç duyar). Eşit olan karşılaştırılabilir nesneleri aynı karma değere sahip olmalıdır.

Hashability, bir sözlük anahtarı ve bir set üyesi olarak kullanılabilen bir nesneyi oluşturur, çünkü bu veri yapıları karma değerini dahili olarak kullanır.

Python’un değişmez tüm yerleşik nesneleri, değiştirilebilir olmayan kaplar (listeler veya sözlükler gibi) içermezken yıkanabilir. 'un kullanıcı tanımlı sınıfların örnekleri olduğu nesneler varsayılan olarak yıkanabilir; hepsi eşitsiz (kendileri hariç) karşılaştırır ve bunların karma değeri, id() öğelerinden türetilen 'dir.

Dolayısıyla, örneğin:

>>> d = {} 
>>> for k,v in zip(range(5), 'TESTS'): #intergers are hashable 
     d[k] = v 
>>> 
>>> d 
{0: 'T', 1: 'E', 2: 'S', 3: 'T', 4: 'S'} 
>>> 
>>> l = [[0], [1], [2], [3], [4]] 
>>> for k,v in zip(l, 'TESTS'): 
     d[k] = v 


Traceback (most recent call last): 
    File "<pyshell#610>", line 2, in <module> 
    d[k] = v 
TypeError: unhashable type: 'list' 

Son olarak, test durumu içine koyarak:

>>> def make_dict(k_list, v_list): 
     d = {} 
     for k,v in zip(k_list, v_list): 
      d[k] = v 
     return d 

>>> make_dict(range(5), 'TESTS') 
{0: 'T', 1: 'E', 2: 'S', 3: 'T', 4: 'S'} 
>>> 
>>> 
>>> l = [[0], [1], [2], [3], [4]] 
>>> 
>>> make_dict(l, 'TESTS') 
Traceback (most recent call last): 
    File "<pyshell#607>", line 1, in <module> 
    make_dict(l, 'TESTS') 
    File "<pyshell#601>", line 4, in make_dict 
    d[k] = v 
TypeError: unhashable type: 'list' 
İlgili konular