2016-11-22 6 views
3

私はデータ構造L = [(int、dict {key:values})、(int、dict {key:values})...]を持っています。入力リストが与えられ私は辞書を含むタプルのリストを持っています。これらの辞書の中の別のリストの値を見つけるためにコードを編集するにはどうすればよいですか?

[0,1]私はに入力リストの両方/全ての値が[0,1]に存在するすべての辞書のキーを見つけたいです。

現在、input_list = [0,1]を使用すると、辞書の値が[0]で、値が[0,1]の一致が返されます。この第2の結果だけが望ましい。私はこれがちょっとした変化だと思っていますが、私はそれを理解することはできません。これを実現するために私は何を変えますか?

コード

#Python3 
L = [(0, {0: [0], 1: [0, 1], 2: [0, 2], 3: [0, 3], 4: [0, 4]}), (1, {0: [1, 0], 1: [1], 2: [5, 1, 2,], 3: [1, 3], 4: [1, 4]}), (2, {0: [2, 0], 1: [2, 1], 2: [2], 3: [2, 3], 4: [2, 4]}), (3, {0: [3, 0], 1: [3, 1], 2: [3, 2], 3: [3], 4: [3, 4]}), (4, {0: [4, 0], 1: [4, 1], 2: [4, 2], 3: [4, 3], 4: [4]})] 

#input_list = (eval(input('Enter your list: '))) 
#input_list = ([0,1]) 
print('Input: ' + str(input_list)) 
for tupl in L: 
    dict_a = (tupl[1]) 
    matching_key = ([key for key, value in dict_a.items() if all(v in input_list for v in value)]) 
    print('Node: ' + str(tupl[0]) + ' Match at key(s): ' + str(matching_key)) 

出力

L = [(0, {0: [0], 1: [0, 1], 2: [0, 2], 3: [0, 3], 4: [0, 4]}), (1, {0: [1, 0], 1: [1], 2: [5, 1, 2,], 3: [1, 3], 4: [1, 4]}), (2, {0: [2, 0], 1: [2, 1], 2: [2], 3: [2, 3], 4: [2, 4]}), (3, {0: [3, 0], 1: [3, 1], 2: [3, 2], 3: [3], 4: [3, 4]}), (4, {0: [4, 0], 1: [4, 1], 2: [4, 2], 3: [4, 3], 4: [4]})] 

Enter your list: [0,1] 
Input: [0, 1] 
Node: 0 Match at key(s): [0, 1] 
Node: 1 Match at key(s): [0, 1] 
Node: 2 Match at key(s): [] 
Node: 3 Match at key(s): [] 
Node: 4 Match at key(s): [] 

Enter your list: [1,5,2] 
Input: [1, 5, 2] 
Node: 0 Match at key(s): [] 
Node: 1 Match at key(s): [1, 2] 
Node: 2 Match at key(s): [1, 2] 
Node: 3 Match at key(s): [] 
Node: 4 Match at key(s): [] 

ありがとうございました:)

+0

実際に '' 'input_list == value'''をしたいですか?または '' 'value'''に' '' input_list'''のすべての項目が含まれていれば? – wwii

答えて

2

:あなたは、単純な順序付きリストの比較のために行くされている場合は、私は行くだろう。 all(v in input_list for v in value)valueのすべての商品がinput_listから見つかることを確認します。あなたはinput_listvalueのサブセットである場合は、簡単にチェックすることができinput_listsetに変換するならば、その

all(v in value for v in input_list) 

注:あなたはそれをあなたが期待通りに動作します周りの他の方法を変更した場合。

L = [(0, {0: [0], 1: [0, 1], 2: [0, 2], 3: [0, 3], 4: [0, 4]}), (1, {0: [1, 0], 1: [1], 2: [5, 1, 2,], 3: [1, 3], 4: [1, 4]}), (2, {0: [2, 0], 1: [2, 1], 2: [2], 3: [2, 3], 4: [2, 4]}), (3, {0: [3, 0], 1: [3, 1], 2: [3, 2], 3: [3], 4: [3, 4]}), (4, {0: [4, 0], 1: [4, 1], 2: [4, 2], 3: [4, 3], 4: [4]})] 

input_list = set([0,1]) 

for tupl in L: 
    dict_a = tupl[1] 
    matching_key = [key for key, value in dict_a.items() if input_list <= set(value)] 
    print('Node: ' + str(tupl[0]) + ' Match at key(s): ' + str(matching_key)) 

出力:

Node: 0 Match at key(s): [1] 
Node: 1 Match at key(s): [0] 
Node: 2 Match at key(s): [] 
Node: 3 Match at key(s): [] 
Node: 4 Match at key(s): [] 
+0

ありがとうございました!これは完全に機能しました。私はあなたが何をしたかを見て、良いレッスン –

-1

をお読みください:

Check if two unordered lists are equalをおよびHow can I compare two ordered lists in python?

同等性をチェックするときに使用するセマンティクスによっては、1つの解決策または他の解決策を使用できます。 valueが周りinput_list間違った方法ですべての項目が含まれている場合は、チェックコードを持って

for tupl in L: 
    dict_a = (tupl[1]) 
    if dict_a != input_list: 
     continue 
    print('Node: ' + str(tupl[0]) + ' Match at key(s): ' + str(matching_key)) 
+0

'' 'dict_a'''は辞書ですが、それはリストと等しいでしょうか? – wwii

+0

おっと、私の悪いです。その後、私たちは再び –

+0

に戻ります。もう一度、私たちは戻ってくるでしょう: dict_a =(tupl [1]) matching_key =([キーのキー、dict_aの値。(キーが一致した場合: '+ str(matching_key)) –

0

あなたが解決するには、set減算を使用することができます:それは理解しやすく、より効率的である

#Python3 
L = [(0, {0: [0], 1: [0, 1], 2: [0, 2], 3: [0, 3], 4: [0, 4]}), (1, {0: [1, 0], 1: [1], 2: [5, 1, 2,], 3: [1, 3], 4: [1, 4]}), (2, {0: [2, 0], 1: [2, 1], 2: [2], 3: [2, 3], 4: [2, 4]}), (3, {0: [3, 0], 1: [3, 1], 2: [3, 2], 3: [3], 4: [3, 4]}), (4, {0: [4, 0], 1: [4, 1], 2: [4, 2], 3: [4, 3], 4: [4]})] 

input_list = (eval(input('Enter your list: '))) 
#input_list = [1,5,2] 
print('Input: ' + str(input_list)) 
for tupl in L: 
    dict_a = (tupl[1]) 
    matching_key = [] 
    for key, lst in tupl[1].items(): 
     if not (set(lst) - set(input_list)): 
      matching_key.append(key) 
    print('Node: ' + str(tupl[0]) + ' Match at key(s): ' + str(matching_key)) 

そして、私のような構造を避けるために、あなたをお勧めしますこの[key for key, value in dict_a.items() if all(v in input_list for v in value)]は混乱しているので、あなたのコードを理解しづらいものにします。

+0

これは可読性を向上させるためにどのように編集し、それを効率的に保つのでしょうか? (niemmiのsollutionを参照して) –

+0

私はNiemmiのソリューションはかなり良いと思います。時には、 '' input_list <= set(value) ''のような式を避ける方がよい場合もあります。dict_a.items()彼らは読むことができるだけでなく、あなたがあなたのsciptにいくつかの変更を加えたい場合は特に混乱するかもしれません。もう一つの欠点は、 '[key for key、dict_a.items()の値がinput_list <= set(value)ならば' 'のような行にエラーがある場合です。しかし、私が示したようにすれば、トレースバックにはエラーのある正確な行が表示されます。 – Fomalhaut

関連する問題