2017-01-06 18 views
1

"children"というキーを持つディクショナリだけを保持するために、辞書のリストをフィルタリングする必要があります。ここではリストの例である:キーに基づいてPythonで辞書のリストをフィルタリングする

[{u'id': 5650, u'children': [{u'id': 4635}]}, {u'id': 5648, u'children': [{u'id': 67}, {u'id': 77}]}, {u'id': 5649}] 

そして、ここでは、私が取得する必要がありますものです:ここでは

[{u'id': 5650, u'children': [{u'id': 4635}]}, {u'id': 5648, u'children': [{u'id': 67}, {u'id': 77}]}] 

は、私が試したものです:

dict((k, data[k]) for k in keys if k in data) 

そして、何私が取得し、それは良いではありません:

[{u'children': [{u'id': 4635}]}, {u'children': [{u'id': 67}, {u'id': 77}]}, {}] 

ヒント? ありがとうございます!

答えて

1
l = [{u'id': 5650, u'children': [{u'id': 4635}]}, {u'id': 5648, u'children': [{u'id': 67}, {u'id': 77}]}, {u'id': 5649}] 
d = [k for k in l if 'children' in k] 
print (d) 

出力:

[{u'id': 5650, u'children': [{u'id': 4635}]}, {u'id': 5648, u'children': [{u'id': 67}, {u'id': 77}]}] 

重要線は二行目(d = ...)です。これは、リスト内の各辞書をループし、「子」キーがあるかどうかをチェックしています。存在する場合は、それがリストに追加されます。存在しない場合はスキップされます。

+0

20秒でビートします。 ; Dしかしあなたの答えには素敵な説明が含まれています。もし私が毎日の投票限度を使い果たしていなかったら、私はそれをアップアップします。 – Tagc

3

filter()機能を使用できます。 2つの引数filter(function, iterable)が必要です。関数が返す値だけが考慮されます。

a=[{u'id': 5650, u'children': [{u'id': 4635}]}, 
    {u'id': 5648, u'children': [{u'id': 67}, {u'id': 77}]}, 
    {u'id': 5649}] 

print filter(lambda x: 'children' in x, a) 

出力:

[{u'id': 5650, u'children': [{u'id': 4635}]}, 
{u'id': 5648, u'children': [{u'id': 67}, {u'id': 77}]}] 

filter(function, iterable)この方法だ[item for item in iterable if function(item)]

3

に相当しているのですか?

dict_list = [{u'id': 5650, u'children': [{u'id': 4635}]}, {u'id': 5648, u'children': [{u'id': 67}, {u'id': 77}]}, {u'id': 5649}] 

filtered = [d for d in dict_list if 'children' in d] 

print(filtered) 

出力

[{'id': 5650, 'children': [{'id': 4635}]}, {'id': 5648, 'children': [{'id': 67}, {'id': 77}]}] 
関連する問題