2016-04-09 7 views
1

私の例のデータ:Pythonは

list_of_dict =[{'cena': 23, 'nazwa': 'item1', 'param': 'pampam'}, 
       {'cena': 26, 'nazwa': 'item2', 'param': 'iko' }, 
       {'cena': 26, 'nazwa': 'item2a','param': 'ik2' }, 
       {'cena': 26, 'nazwa': 'item2b','param': 'ik2' }, 
       {'cena': 17, 'nazwa': 'item3', 'param': 'etr' }, 
       {'cena': 17, 'nazwa': 'item4', 'param': 'asdf' }] 

conditions = {'cena': 26, 'param': 'ik2' } 

私が試した:

if conditions in list_of_dict: 
    do_something() 

それは動作しますが、場合にのみ、全体の条件のdict(すべてのキー)はdictリストのものと一致します。

In [1]: exampleSet =  [{ 'type' : 'type1', 'k' : 'kval'}, 
    ...:     { 'type' : 'type2', 'k' : 'kv2' }, 
    ...:     { 'type' : 'type2', 'k' : 'k3' }, 
    ...:     { 'type' : 'type3', 'k' : 'k3' }] 
    ...: 
    ...: conditions =  { 'type' : 'type1', 'k' : 'kval' } 
    ...: 
    ...: 
    ...: conditions in exampleSet 
    ...: 
Out[1]: True 
In [2]: conditions =  { 'type' : 'type1' } 

In [3]: conditions in exampleSet 
Out[3]: False 

私はキー値pと辞書を照合しようとしていますが

     [{ 'type' : 'type2', 'k' : 'kv2' }, 
         { 'type' : 'type2', 'k' : 'k3' }] 

結果:そう

In [4]: exampleSet =  [{ 'type' : 'type1', 'k' : 'kval'}, 
    ...:     { 'type' : 'type2', 'k' : 'kv2' }, 
    ...:     { 'type' : 'type2', 'k' : 'k3' }, 
    ...:     { 'type' : 'type3', 'k' : 'k3' }] 
    ...: 
    ...: conditions =  { 'type' : 'type2' } 
    ...: 
    ...: my_wanted_match(exampleSet, conditions) 

(かかわらず、値/不特定のものの存在)、指定された放映する返すことがあります。

誰でも、これを達成するためのヒントを教えていただけますか?

+0

私はあなたを理解していれば、私は一度、基本的にはまったく同じ問題に沸く質問に答え問題が正しく:[pythonのfindWhere()の動作をエミュレート](http://stackoverflow.com/questions/23553060/emulating-the-behavior-of-findwhere-in-python/23553240) –

答えて

0
def my_wanted_match(example_set, conditions): 
    conditions = conditions.items() 
    match = [] 
    for e in example_set: 
     if all([c in set(e.items()) for c in conditions]): 
      match.append(e) 
    return match 

または単に:

match = [e for e in example_set 
     if all([c in set(e.items()) for c in set(conditions.items())])] 
+0

'set'がスローされますif 'e.values()'のどれかはハッシュ可能ではない、悲しいことに – Eric

0

このlist_of_dictにおける各辞書を反復処理し、各状態にキーと値のペアと一致しているものを返します。

matches = [one_dict for one_dict in list_of_dict if 
      all(key in one_dict and conditions[key] == one_dict[key] 
       for key in conditions.keys())] 
>>> matches 
[{'cena': 26, 'nazwa': 'item2a', 'param': 'ik2'}, 
{'cena': 26, 'nazwa': 'item2b', 'param': 'ik2'}] 
0

setここで便利に*来る(S)

has_match = any(set(condition.items()) <= set(d.items()) for d in listOfDict) 

たり、第二部のために:セットに適用した場合に

the_matches = [ 
    d 
    for d in listOfDict 
    if set(condition.items()) <= set(d.items()) 
] 

<=はサブセット演算子です:

issubset(other)
set <= other

セット内のすべての要素が他にあるかどうかをテスト。

あなたの値はハッシュ可能であることを確認することができます提供

*、すなわちないリストやdicts

0

使用リスト内包表記:

>>> list_of_dict =[{'cena': 23, 'nazwa': 'item1', 'param': 'pampam'}, 
...    {'cena': 26, 'nazwa': 'item2', 'param': 'iko' }, 
...    {'cena': 26, 'nazwa': 'item2a','param': 'ik2' }, 
...    {'cena': 26, 'nazwa': 'item2b','param': 'ik2' }, 
...    {'cena': 17, 'nazwa': 'item3', 'param': 'etr' }, 
...    {'cena': 17, 'nazwa': 'item4', 'param': 'asdf' }] 
>>> 
>>> conditions = {'cena': 26, 'param': 'ik2' } 
>>> [d for d in list_of_dict if all((k in d and d[k] == v) for k, v in conditions.items())] 
[{'cena': 26, 'param': 'ik2', 'nazwa': 'item2a'}, {'cena': 26, 'param': 'ik2', 'nazwa': 'item2b'}] 
1

それはあなたが望むfilter()です - あなたは、あなたのリストをいくつかの条件に基づいてフィルタリングしたい。すべての条件に一致するエントリのみを返します。

>>> list_of_dict =[{'cena': 23, 'nazwa': 'item1', 'param': 'pampam'}, 
...    {'cena': 26, 'nazwa': 'item2', 'param': 'iko' }, 
...    {'cena': 26, 'nazwa': 'item2a','param': 'ik2' }, 
...    {'cena': 26, 'nazwa': 'item2b','param': 'ik2' }, 
...    {'cena': 17, 'nazwa': 'item3', 'param': 'etr' }, 
...    {'cena': 17, 'nazwa': 'item4', 'param': 'asdf' }] 

セット条件:

>>> conditions = {'param':'iko'} 

1行のフィルタを実行します。

>>> filter(lambda item: all((item[k]==v for (k,v) in conditions.iteritems())), list_of_dict) 
[{'cena': 26, 'param': 'iko', 'nazwa': 'item2'}]