从字典列表中提取多个键的值

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 多个元素,这个解决方案不是很有效。

是否有任何优化的方法可以只过滤掉 ipv4ipv6 值而不迭代列表中的每个元素?

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
]

解释:

  1. 对于列表中的每个字典,您正在尝试获取键 'ipv4''ipv6' 的值并将其存储在 ip_address.
  2. 如果两者都没有值,它将跳过该元素。