2016-04-13 23 views
0

Şu anda bir sözlük şöyle var:Sözlükle listeyi değer olarak tersine çevirmenin en iyi yolu?

app_dict = {test1 : [[u'app-1', u'app-2', u'app-3', u'app-4']]} 

Ben (başka bir sözlükle çalışmaktan kanıtlanmış) sözlüğünü tersine bir işlevi var. Ben aşağıdaki işlemleri

def reverse_dictionary(self, app_dict): 
    """ In order to search by value, reversing the dictionary """ 
    return dict((v,k) for k in app_dict for v in app_dict[k]) 

bir hata alıyorum:

data = reverse_dictionary(app_dict) 
print data 

ERROR: 
return dict((v,k) for k in app_dict for v in app_dict[k]) 
TypeError: unhashable type: 'list' 

emin değilim ama mesele benim Sözlük ne şekilde yapılandırıldığı ile olduğunu düşünüyorum, neden orada değil eminim Listemde çift parantez var ve bunları kaldırmak için görünmüyor olabilir. App_dict ile çalışmak için reverse_dictionary işlevini nasıl değiştirebilirim?

DÜZENLEME:

Bu noktada new_dict yazdırırken, benim Sözlük değerler (çift parantez ile) aşağıdaki biçimde gösteriyor ki
new_dict = collections.defaultdict(list) 
app_dict = collections.defaultdict(list) 

#at this point, we have filled app_dict with data (cannot paste here) 
for o, q in app_dict.items(): 
    if q[0]: 
     new_dict[o].append(q[0]) 

Not: [[u'app-1' , u'app 2' , u'app-3' , u'app-4' ]]

I ekleme hattı değiştirirseniz: new_dict [o] .Append (q, [0] [0]) Bu yüzden Bunun yerine, bunun yerine parantezler şerit olacağını varsayalım, bu listede yalnızca ilk değeri ekler:

[u'app-1'] 

Bu sorunu yaşadığımdan eminim çünkü çıktı parantezlerini başarıyla listeden çıkaramıyorum.

+0

İpucu: Çift parantez başka bir listeye – Izkata

+0

içinde bir liste vardır bu konu biliyorum, ama bunu düzeltmek için ne kadar emin değilim benim güncellenmiş yazıyı – david

+0

bakınız. – david

cevap

0

Ben Düzenlemenizi kullanırsanız, bu hata sadece onlar değişken olduğu için listeleri sözlükte bir anahtar olarak kullanılamaz söylüyor

new_dict = collections.defaultdict(list) 
app_dict = collections.defaultdict(list) 

#at this point, we have filled app_dict with data (cannot paste here) 
for o, q in app_dict.items(): 
    if q[0]: 
     for value in q[0]: 
      new_dict[o].append(value) 
+0

Taslağımın tek bir değer listesini nasıl eklerim? Şu anda sadece bir listeye veya her bir öğeye bir liste ekleyebiliyorum gibi görünüyor. Sadece bir listeye girmek yerine bu ikisi arasında atlama gibi görünüyor. – david

+0

Güncel işlevinizi denedim ve TypeError aldım: liste dizinleri tamsayı olmalı, unicode değil – david

+0

Tamam, kendi düzenlemelerinize göre güncelledim. –

1

işe yarayabilir. Bununla birlikte, tuplelar değişmezdir ve bu nedenle bir anahtar olarak kullanılabilir.

etrafında olası bir çalışma olabilir:

def reverse_dictionary(self, app_dict): 
    """ In order to search by value, reversing the dictionary """ 
    return dict((v,k) if type(v) != list else (tuple(v), k) for k in app_dict for v in app_dict[k]) 
+0

Yazımı güncelledim – david

0

Bu, şu anlama aynı ters fonksiyonudur ama Sözlük sadece ilk unsur üzerinde kullanıldığı listelerin bir listesini içeren dikkate alır. Verilerin doğru biçimde ve dolayısıyla çift köşeli parantez içinde olmadığına inanıyorum, ancak bu değişiklik ile çalışır.

>>> dict([(v, k) for k in app_dict for v in app_dict[k][0]]) 
{u'app-4': 'test1', u'app-3': 'test1', u'app-2': 'test1', u'app-1': 'test1'} 
+1

Bu kod soruyu yanıtlayabilirken, neden ve/veya sorunun nasıl yanıtlandığıyla ilgili ek bağlam sağlayarak uzun vadeli değerini önemli ölçüde artıracaktır.Lütfen bazı açıklama eklemek için cevabınızı [düzenleyin]. – CodeMouse92