2016-11-06 11 views
1

このキーが保持する値ではなく、単一のキーに基づいて(別の)辞書のリストをフィルタリングしたいと思います。Pythonのキー(キー値ではない)に基づいて辞書のリストをフィルタリングします

これは一例です:

diclist_example=[{'animal': 'dog', 'legs': 'four'}, 
       {'tvshow': 'Game of Thrones','rating': 'good'}, 
       {'food': 'banana','color': 'yellow'}, 
       {'animal': 'sheep', 'legs': 'four'}, 
       {'tvshow': 'Gossip Girl','rating': 'bad'}, 
       {'food': 'pizza','color': 'red-ish'}] 

これに伴う問題は、私は例えば'animal'値を処理しようとすると、いくつかのdictonariesが'animal'値が含まれていないので、私はKeyError例外を取得しています。

すべての動物のリスト、すべての食品のリストのすべてのtvshowsのリストなど、キーに基づいてすべての辞書を含む辞書の新しいリストを生成したいと考えています。

+1

正確な出力を見せてくれますか? – Arman

+0

ようこそstackoverflowへ。将来、入出力の例は、あなたが求めることを説明するのに役立ちます。 – ninjagecko

+0

ありがとう、申し訳ありません。理想的なアウトプットは次のようなものです:私が「動物」を尋ねるならば、それはリストに「動物」のキーを持つすべての辞書を私に与えるべきですので、「{動物」:「犬」、「足」:「四」} {'動物': '羊'、 '足': '四'}]。私が「テレビ番組」や「食べ物」を求めるなら、これは私に似たリストを与えるでしょう。 –

答えて

1

要素をリスト内包でフィルタリングするlambda関数を使用できます。この機能は、あなたが

allElements = [getAllElementsWithSameKey(k) for k in ('animal','tvshow','food')] 
0

ですべての辞書のリストを作成することができ、すべて同一の要素

getAllElementsWithSameKey = lambda key:[d for d in diclist_example if key in d] 
getAllElementsWithSameKey('animal') 

のリストを返しますdefaultdictを使用して自動的に辞書のリストを作成します。

from collections import defaultdict 

diclist_example=[{'animal': 'dog', 'legs': 'four'}, 
       {'tvshow': 'Game of Thrones','rating': 'good'}, 
       {'food': 'banana','color': 'yellow'}, 
       {'animal': 'sheep', 'legs': 'four'}, 
       {'tvshow': 'Gossip Girl','rating': 'bad'}, 
       {'food': 'pizza','color': 'red-ish'}] 

diclist = defaultdict(list) 
for l in diclist_example: 
    for k in ('animal','food','tvshow'): 
     if k in l: 
      diclist[k].append(l) 
      break 

print(diclist) 

結果:

defaultdict(<class 'list'>, {'food': [{'color': 'yellow', 'food': 'banana'}, {'color': 'red-ish', 'food': 'pizza'}], 'tvshow': [{'rating': 'good', 'tvshow': 'Game of Thrones'}, {'rating': 'bad', 'tvshow': 'Gossip Girl'}], 'animal': [{'legs': 'four', 'animal': 'dog'}, {'legs': 'four', 'animal': 'sheep'}]}) 
0

値はif文を使用して、それで何かを行う前に存在する場合は、必ずチェックする必要があります。あなたの例に適用する

if myValue!=None: # or similar, depending on situation 
    # do something 

def zipDict(dicts): 
    allKeys = set() 
    for d in dicts: 
     for key in d: 
      allKeys.add(key) 

    toReturn = {} 
    for key in allKeys: 
     toReturn[key] = [] 
     for d in dicts: 
      if key in d: # THE GUARDIAN IF STATEMENT THAT PROTECTS YOU 
       toReturn[key].append(d[key]) 

    return toReturn 

追記:この記事つまずくことがあり、他のユーザーのために、ここにある。ここ

def zipDict(dicts): 
    allKeys = set(k for d in dicts for k in d.keys()) 
    return {k:[d[k] for d in dicts if (k in d)] for k in allKeys} 
            ########### 

は、より詳細なバージョンですより効率的な方法:あなたはすべてのキーではなく、辞書全体を反復する必要があります。そうでなければ、アルゴリズムはO(N)ではなくO(#keys * #dicts)です。

def zipDict(dicts): 
    R = {} 
    for d in dicts: 
     for k,v in d.items(): 
      if not k in R: # A PROTECTIVE IF STATEMENT 
       R[k] = [] 
      R[k].append(v) 
    return R 

あなたはそれ少しよりよいコードを作るためにdefaultdictを使用することができます。

def zipDict(dicts): 
    R = defaultdict(list) 
    for d in dicts: 
     for k,v in d.items(): 
      R[k].append(v) 
    return dict(R) 
0

例[ハードコーディングされた]:

リットル= [dict_eltためdict_elt diclist_exampleであればdict_eltの '動物']

0

また、次の方法を試すこともできます。

filter(lambda x: x["animal"] if "animal" in x else None, diclist_example) 
関連する問題