为什么lambda表达式结果对象的dict转换有什么问题?

2024-05-15 21:01:20 发布

您现在位置:Python中文网/ 问答频道 /正文

当我想到我有宇宙中最好的lambda表达式来使用python和netifaces返回所有需要的相关网络信息时,我会感到很得意吗

>>> list(map(lambda interface: (interface, dict(filter(lambda ifaddress: ifaddress in (netifaces.AF_INET, netifaces.AF_LINK), netifaces.ifaddresses(interface) )))  , netifaces.interfaces()))

但我知道了

^{pr2}$

缩小一点

>>>dict(filter(lambda ifaddress: ifaddress in (netifaces.AF_INET, netifaces.AF_LINK), netifaces.ifaddresses("eth0")))

问题在于:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot convert dictionary update sequence element #0 to a  sequence

但是我可以把filter对象转换成一个列表

 >>> list(filter(lambda ifaddress: ifaddress in (netifaces.AF_INET, netifaces.AF_LINK), netifaces.ifaddresses("eth0")))
 [17, 2]

但是,那不是我想要的。我想要的是:

>>> netifaces.ifaddresses("tun2")
{2: [{'addr': '64.73.0.0', 'netmask': '255.255.255.255', 'peer': '192.168.15.4'}]}
>>> type (netifaces.ifaddresses("eth0"))
<class 'dict'>

那么,是什么把我的词汇量背回到字典里去了?在


Tags: lambdainlink宇宙filterdictinterfacelist
1条回答
网友
1楼 · 发布于 2024-05-15 21:01:20

当给定一个字典作为输入时,filter将只迭代并从该字典返回。在

>>> filter(lambda x: x > 1, {1:2, 3:4, 5:6})
[3, 5]

因此,您只是将过滤后的键序列输入到新的dict中,而不是键值对。您可以这样修复它:注意对items()的调用,以及内部lambda如何获得一个元组作为输入。在

^{pr2}$

这可不是很漂亮。。。我建议您将代码更改为嵌套列表和字典理解:

^{3}$

相关问题 更多 >