使用lambda访问列表中字典的值

时间:2016-05-28 15:08:59

标签: python list dictionary lambda

我是python的新手。我在列表中有多个词典,我想根据值进行一些分析。我使用lambda的原因是因为并不总是期望这个函数。我只是显示2个词典供参考,但输出有时会给我多个词典。

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)

当我使用print语句时,它会给我一个关键错误:0。我理解数据包的值是一个整数,对于ip_src / ip_proto,值是一个字符串。

如何使用lambdas访问这些值?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

如果您尝试将数据包作为单独的项目列表提取,那么您将不会使用过滤器。过滤器只会减少新列表中的词典数量。你可以使用列表理解,

clang++ hello.cpp -o main-vc.exe -std=c++14 --target=x86_64-pc-windows-msvc19.0.0 -v
 -Xlinker "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64\libcmt.lib" 
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64\libcpmt.lib" 
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64\libvcruntime.lib" 
"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\ucrt\x64\libucrt.lib"

这会在统计信息中创建packets = [x['packets'] for x in statistics] print(packets) # [30, 34] 值列表。

其他两组值相同。

答案 2 :(得分:0)

filter函数返回原始列表,而不包含lambda求值为false的元素。所以,如果你正确地做到了这一点,你就会得到所有的元素,因为在Python中,非空字符串或0以外的值被认为是True。

如果您想获得键的这些值,则需要列表理解。

packets = list(x["packets"] for x in statistics)