Python 3.6 - 在列表中搜索单词,其中包含列表

时间:2018-04-04 10:01:03

标签: python python-3.x list dictionary python-3.6

我试着做一个简单的标题,但我对这个有点迷失。

我正在使用python模块Python-HPILO来收集HP Blades上的硬盘驱动器磁盘和DIMM详细信息等信息,这是有效的。

示例:

import hpilo
ilo = hpilo.Ilo('10.0.0.1', 'USER', 'PASSWORD')
health = ilo.get_embedded_health()
logical_drives = (health['storage']['Controller on System Board']['logical_drives'])
print(logical_drives)

结果(匿名):

[{**'label': '01', 'status': 'OK', 'capacity': '419 GiB', 'fault_tolerance': 'RAID 1/RAID 1+0', 'logical_drive_type': 'Data LUN', 'encryption_status': 'Not Encrypted', 'physical_drives': **[{**'label': 'Port 1I Box 1 Bay 1', 'status': 'OK', 'serial_number': 'SXXXXXXXX', 'model': 'YYYYYY', 'capacity': '419 GiB', **'marketing_capacity': '450 GB'**, 'location': 'Port 1I Box 1 Bay 1', 'fw_version': 'HPD9', 'drive_configuration': 'Configured', 'encryption_status': 'Not Encrypted', 'media_type': 'HDD'**}**, {'label': 'Port 1I Box 1 Bay 2', 'status': 'OK', 'serial_number': 'SXXXXXX', 'model': 'YYYYYY', 'capacity': '419 GiB', 'marketing_capacity': '450 GB', 'location': 'Port 1I Box 1 Bay 2', 'fw_version': 'HPD9', 'drive_configuration': 'Configured', 'encryption_status': 'Not Encrypted', 'media_type': 'HDD'**}]}]

我想收集marketing_capacity的价值,这里是450GB。我发现了一些与列表或词典中的入侵性搜索有关的其他主题,但是我无法使用这个特定列出的列出的dictonary-dictonary事件。

有没有人有这种清单进行研究的简单方法/功能?

5 个答案:

答案 0 :(得分:2)

您可以通过

访问该变量
logical_drives[0]['physical_drives'][0]['marketing_capacity']
  

'450 GB'

如果字典的嵌套发生变化,您可以打开列表中的列表和字典,然后提取所需的值

val ='marketing_capacity'

def unwrap(dic):    
    temp = {}
    for i in dic:
        if type(i) in [list, dict]: temp.update(unwrap(i))
        elif type(dic[i]) in [list, dict]: temp.update(unwrap(dic[i]))
        else: temp.update({i: dic[i]})
    return temp

temp = [{'label': '01', 'status': 'OK', 'capacity': '419 GiB', 'fault_tolerance': 'RAID 1/RAID 1+0', 'logical_drive_type': 'Data LUN', 'encryption_status': 'Not Encrypted', 'physical_drives': [{'label': 'Port 1I Box 1 Bay 1', 'status': 'OK', 'serial_number': 'SXXXXXXXX', 'model': 'YYYYYY', 'capacity': '419 GiB', 'marketing_capacity': '450 GB', 'location': 'Port 1I Box 1 Bay 1', 'fw_version': 'HPD9', 'drive_configuration': 'Configured', 'encryption_status': 'Not Encrypted', 'media_type': 'HDD'}, {'label': 'Port 1I Box 1 Bay 2', 'status': 'OK', 'serial_number': 'SXXXXXX', 'model': 'YYYYYY', 'capacity': '419 GiB', 'marketing_capacity': '450 GB', 'location': 'Port 1I Box 1 Bay 2', 'fw_version': 'HPD9', 'drive_configuration': 'Configured', 'encryption_status': 'Not Encrypted', 'media_type': 'HDD'}]}]
x = unwrap(temp)
x['marketing_capacity']

答案 1 :(得分:2)

列表中的字典没有什么特别之处。您已经知道如何查找嵌套值 - 只需继续相同的原则。

print(logical_drives[0]['physical_drives'][0]['marketing_capacity'])

答案 2 :(得分:1)

试试这个

import hpilo
ilo = hpilo.Ilo('10.0.0.1', 'USER', 'PASSWORD')
health = ilo.get_embedded_health()
logical_drives = (logical_drives[0]['physical_drives'][0]['marketing_capacity'])
print(logical_drives)

答案 3 :(得分:1)

像其他任何列表一样循环遍历:

drive_data =  health['storage']['Controller on System Board']['logical_drives']

for logical_drive in drive_data:
    for physical_drive in logical_drive['physical_drives']:
       print(physical_drive['marketing_capacity'])

答案 4 :(得分:1)

要获取'marketing_capacity'的所有值,我会使用通用列表理解。

lst = [{'label': '01', 'status': 'OK', 'capacity': '419 GiB', 'fault_tolerance': 'RAID 1/RAID 1+0', 'logical_drive_type': 'Data LUN', 'encryption_status': 'Not Encrypted', 'physical_drives': [{'label': 'Port 1I Box 1 Bay 1', 'status': 'OK', 'serial_number': 'SXXXXXXXX', 'model': 'YYYYYY', 'capacity': '419 GiB', 'marketing_capacity': '450 GB', 'location': 'Port 1I Box 1 Bay 1', 'fw_version': 'HPD9', 'drive_configuration': 'Configured', 'encryption_status': 'Not Encrypted', 'media_type': 'HDD'}, {'label': 'Port 1I Box 1 Bay 2', 'status': 'OK', 'serial_number': 'SXXXXXX', 'model': 'YYYYYY', 'capacity': '419 GiB', 'marketing_capacity': '450 GB', 'location': 'Port 1I Box 1 Bay 2', 'fw_version': 'HPD9', 'drive_configuration': 'Configured', 'encryption_status': 'Not Encrypted', 'media_type': 'HDD'}]}]

res = [d2.get('marketing_capacity') for d2 in d.get('physical_drives') for d in lst]

# ['450 GB', '450 GB']

请注意,这适用于外部列表中的任意字典,以及内部列表中的任意字典。