【问题标题】:Python 3.6 - Search word in a list that contain dictionary that containt dictionary in listPython 3.6 - 在包含字典的列表中搜索单词,该字典包含列表中的字典
【发布时间】:2018-09-13 20:22:06
【问题描述】:

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

我正在使用 Python 模块 Python-HPILO 来收集一些信息,例如 HP 刀片上的硬盘驱动器磁盘和 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。我在 list 或 dict 中发现了一些与 incursive search 相关的其他主题,但我无法使其适用于这个特定的 lists-ditonary-listed-ditonary 事物。

有没有人有一个简单的方法/功能来研究这种列表?

【问题讨论】:

  • 如何处理重复?比如第二个字典有500GB?

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


【解决方案1】:

您可以通过

访问该变量
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']

【讨论】:

    【解决方案2】:

    要获得“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']
    

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

    【讨论】:

      【解决方案3】:

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

      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】:

      试试这个

      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)
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多