从字典列表中提取多个键的值
Extract values for multiple keys from list of dictionary
我是 Python 的新手,正在寻求一些帮助。我有如下字典列表:
data = [
{'device_id': 'D11', 'ipv4': '1.1.1.1'},
{'device_id': 'D42', 'ipv4': '1.1.1.2'},
{'device_id': 'D32', 'hostname': 'MVPQ021'},
{'device_id': 'D94', 'ipv6': '2001:0db8:0:7334'}
]
我只需要获取如下 IP 地址列表:
['1.1.1.1', '1.1.1.2', '2001:0db8:0:7334']
我尝试了以下方法,得到了我想要的结果:
result = []
for x in data:
if 'ipv4' in x.keys():
result.append(x['ipv4'])
continue
if 'ipv6' in x.keys():
result.append(x['ipv6'])
然而,对于一个非常长的列表,例如有 1000 多个元素,这个解决方案不是很有效。
是否有任何优化的方法可以只过滤掉 ipv4
和 ipv6
值而不迭代列表中的每个元素?
将 x.keys()
更改为 x
,关于我的测试,您将获得大约 20-30% 的收益。
for x in data:
if 'ipv4' in x:
result.append(x['ipv4'])
continue
if 'ipv6' in x:
result.append(x['ipv6'])
对我来说有些性能
- 3.2 秒 10M
- 17 秒 50M
尝试更实用的款式一衬里:
ip_list = list(filter(None, map(lambda i: i.get('ipv4', i.get('ipv6')), data)))
假设您使用的是 Python 3.8+,您可以如下利用 :=
(海象运算符),并且您可以在一个列表理解中完成:
data = [
{'device_id': 'D11', 'ipv4': '1.1.1.1'},
{'device_id': 'D42', 'ipv4': '1.1.1.2'},
{'device_id': 'D32', 'hostname': 'MVPQ021'},
{'device_id': 'D94', 'ipv6': '2001:0db8:0:7334'}
]
result = [
ip_address for e in data
if (ip_address := e.get('ipv4') or e.get('ipv6')) is not None
]
解释:
- 对于列表中的每个字典,您正在尝试获取键
'ipv4'
或 'ipv6'
的值并将其存储在 ip_address
. 中
- 如果两者都没有值,它将跳过该元素。
我是 Python 的新手,正在寻求一些帮助。我有如下字典列表:
data = [
{'device_id': 'D11', 'ipv4': '1.1.1.1'},
{'device_id': 'D42', 'ipv4': '1.1.1.2'},
{'device_id': 'D32', 'hostname': 'MVPQ021'},
{'device_id': 'D94', 'ipv6': '2001:0db8:0:7334'}
]
我只需要获取如下 IP 地址列表:
['1.1.1.1', '1.1.1.2', '2001:0db8:0:7334']
我尝试了以下方法,得到了我想要的结果:
result = []
for x in data:
if 'ipv4' in x.keys():
result.append(x['ipv4'])
continue
if 'ipv6' in x.keys():
result.append(x['ipv6'])
然而,对于一个非常长的列表,例如有 1000 多个元素,这个解决方案不是很有效。
是否有任何优化的方法可以只过滤掉 ipv4
和 ipv6
值而不迭代列表中的每个元素?
将 x.keys()
更改为 x
,关于我的测试,您将获得大约 20-30% 的收益。
for x in data:
if 'ipv4' in x:
result.append(x['ipv4'])
continue
if 'ipv6' in x:
result.append(x['ipv6'])
对我来说有些性能
- 3.2 秒 10M
- 17 秒 50M
尝试更实用的款式一衬里:
ip_list = list(filter(None, map(lambda i: i.get('ipv4', i.get('ipv6')), data)))
假设您使用的是 Python 3.8+,您可以如下利用 :=
(海象运算符),并且您可以在一个列表理解中完成:
data = [
{'device_id': 'D11', 'ipv4': '1.1.1.1'},
{'device_id': 'D42', 'ipv4': '1.1.1.2'},
{'device_id': 'D32', 'hostname': 'MVPQ021'},
{'device_id': 'D94', 'ipv6': '2001:0db8:0:7334'}
]
result = [
ip_address for e in data
if (ip_address := e.get('ipv4') or e.get('ipv6')) is not None
]
解释:
- 对于列表中的每个字典,您正在尝试获取键
'ipv4'
或'ipv6'
的值并将其存储在ip_address
. 中
- 如果两者都没有值,它将跳过该元素。