2016-04-13 3 views
0

私は現在、そうのような辞書を持っている:リストを値として辞書を逆転させる最も良い方法は?

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

私は(別の辞書での作業であることが証明された)辞書を反転させる機能を持っています。

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]) 

私は次の操作を実行したときに、私はエラーを取得:

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' 

私はなぜそこにわからないんだけど、私はわからないんだけど、私は問題は私の辞書が構成されている方法であると思います私のリストに二重括弧が付いているので、削除することはできません。 reverse_dictionary関数をapp_dictと連携させるために、どうすれば修正できますか?

編集:私はこの時点でnew_dictを印刷するとき、私の辞書の値は(二重括弧付き)次の形式で示すことが

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]) 

注: [[u'app-1' 、u'app -2' 、u'app-3' 、u'app-4' ]]

私は追加行を変更する場合: new_dict [O] .append(Q [0] [0]) どのI仮定は、これの代わりに、最初の値をリストに追加するだけです。

[u'app-1'] 

私はこれが私が問題になっていると信じています。リストから外括弧を正常に削除できません。

+0

ヒント:二重括弧別のリスト – Izkata

+0

内部リストされている私は、これは問題ですけど、私はそれを修正するかどうかはわかりません – david

+0

私の更新記事を参照してください。 – david

答えて

0

私はあなたの編集を使用している場合、これはエラーは単に彼らは変更可能ですので、リストは辞書でキーとして使用することはできないと言っている

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

私はどのように私のdictに単一の値リストを追加するだけですか?現在、リスト内にリストを追加するか、個々の要素を追加することしかできないようです。 1つのリストだけではなく、その2つの間をスキップしているようです。 – david

+0

私はあなたの更新された関数を試して、TypeErrorを得ました:リストのインデックスはユニコードではなく、整数でなければなりません – david

+0

あなた自身の編集に関して更新しました。 –

1

を働くかもしれません。ただし、タプルは不変であるため、キーとして使用できます。周り

可能な作業は、次のようになります。

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

私の投稿を更新しました – david

0

これは、あなたが持っているものと同じ逆の機能ですが、辞書が最初の要素だけが使用されているリストのリストが含まれていることを考慮に入れました。私は、データが適切な形式ではなく、二重括弧ではないと信じていますが、この変更では機能します。

>>> 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

このコードは質問に答えるかもしれませんが、理由や質問にどのように答えるかについての追加の文脈を提供することで、長期的な価値が大幅に向上します。あなたの答えを[編集]して、説明を加えてください。 – CodeMouse92

関連する問題