2016-05-28 15 views
0

私はPythonの初心者です。私はリストの中に複数の辞書を持っており、私は値に基づいていくつかの分析をしたい。私がラムダを使用している理由は、その関数が常に期待されるわけではないからです。私は参考のために2つの辞書を表示していますが、その出力は時々私に複数の辞書を与えます。私はprint文を使用している場合はラムダを使ったリストの辞書の値へのアクセス

statistics = [{"ip_dst": "10.0.0.1", "ip_proto": "icmp", "ip_src": "10.0.0.3", 
       "bytes": 1380, "port_dst": 0, "packets": 30, "port_src": 0}, 
       {"ip_dst": "10.0.0.3", "ip_proto": "icmp", "ip_src": "10.0.0.1", 
       "bytes": 1564, "port_dst": 0, "packets": 34, "port_src": 0}] 

packets = filter(lambda x: x[0]["packets"], statistics) 
ip_src = filter(lambda x: x[0]["ip_src"], statistics) 
ip_proto = filter(lambda x: x[0]["ip_proto"], statistics) 

、私の主なエラーを与えている:0.私はパケットの値が整数であるとip_src/ip_protoのために、値が文字列であることを理解しています。

ラムダを使用してこれらの値にアクセスするにはどうすればよいですか?

答えて

1

。フィルタは、新しいリストの辞書の数を減らすだけです。あなたは、これは統計でx['packets']値のリストを作成し、

packets = [x['packets'] for x in statistics] 
print(packets) 
# [30, 34] 

をリストの内包表記を使用することができます。

他の2つの値についても同じです。

1

[0]は必要ありません。

filter(lambda x: ...)を使用する場合、xは繰り返し可能な要素です。 ディクショナリのリストがあるので、xが辞書そのものになります。

あなたのコードは次のようになります。あなたは、あなたがフィルタを使用することはありませんアイテムの別のリストとしてパケットを抽出しようとしている場合

statistics = [{"ip_dst": "10.0.0.1", "ip_proto": "icmp", "ip_src": "10.0.0.3", "bytes": 1380, "port_dst": 0, "packets": 30, "port_src": 0}, {"ip_dst": "10.0.0.3", "ip_proto": "icmp", "ip_src": "10.0.0.1", "bytes": 1564, "port_dst": 0, "packets": 34, "port_src": 0}] 


packets = filter(lambda x: x["packets"], statistics) 
ip_src = filter(lambda x: x["ip_src"], statistics) 
ip_proto = filter(lambda x: x["ip_proto"], statistics) 
+0

「パケットを印刷する」というのは、私にパケットの値だけを与えるのではなく、印刷するときです。出力はリスト全体です。 ip_srcおよびip_protoと同じです。 –

+0

Andy Gの答えを使用してください。 'filter'はあなたが思うとは思わない:https://docs.python.org/2/library/functions.html#filter – DeepSpace

0

filter関数は、lambdaがfalseと評価する要素を除いた元のリストを返します。だから、正しく実行すれば、空でない文字列や0以外の値がPythonではTrueとみなされるため、すべての要素を取得できます。

キーの値だけを取得したい場合は、リストの理解が必要です。

packets = list(x["packets"] for x in statistics) 
関連する問題