Python:如何将列表拆分为字典列表?

4 投票
5 回答
15092 浏览
提问于 2025-04-15 17:18

我刚开始学习Python,知道的东西少得可怜,感觉自己一无所知。我想找一些不同的方法,把一个列表分割成多个字典的列表。比如说,这里有一个示例列表:

data = ['ID:0:0:0',
        'Status:Ok',
        'Name:PhysicalDisk0:0:0',
        'State:Online',
        'FailurePredicted:No',
        'ID:0:0:1',
        'Status:Ok',
        'Name:PhysicalDisk0:0:1',
        'State:Online',
        'FailurePredicted:No']

最后得到的字典列表应该是这样的:

[{'Status': 'Ok',
  'State': 'Online',
  'ID': '0:0:0',
  'FailurePredicted': 'No',
  'Name': 'PhysicalDisk0:0:0'},
 {'Status': 'Ok',
  'State': 'Online',
  'ID': '0:0:1',
  'Name': 'PhysicalDisk0:0:1',
  'FailurePredicted': 'No'}]

这个列表里有重复的元素,所以需要多个字典,而且列表的长度也不固定。我觉得我的代码可以简化一下,只是我对Python还不够熟悉。现在我的代码是:

已删除的代码 这个代码没有成功。 :(

----------- File output as requested -------------------

# omreport storage pdisk controller=0
List of Physical Disks on Controller PERC 5/i Integrated (Embedded)

Controller PERC 5/i Integrated (Embedded)
ID                        : 0:0:0
Status                    : Ok
Name                      : Physical Disk 0:0:0
State                     : Online
Failure Predicted         : No
Progress                  : Not Applicable
Type                      : SAS
Capacity                  : 136.13 GB (146163105792 bytes)
Used RAID Disk Space      : 136.13 GB (146163105792 bytes)
Available RAID Disk Space : 0.00 GB (0 bytes)
Hot Spare                 : No
Vendor ID                 : DELL    
Product ID                : ST3146755SS     
Revision                  : T107
Serial No.                : 3LN1EF0G            
Negotiated Speed          : Not Available
Capable Speed             : Not Available
Manufacture Day           : 07
Manufacture Week          : 24
Manufacture Year          : 2005
SAS Address               : 5000C50004731C35

ID                        : 0:0:1
Status                    : Ok
Name                      : Physical Disk 0:0:1
State                     : Online
Failure Predicted         : No
Progress                  : Not Applicable
Type                      : SAS
Capacity                  : 136.13 GB (146163105792 bytes)
Used RAID Disk Space      : 136.13 GB (146163105792 bytes)
Available RAID Disk Space : 0.00 GB (0 bytes)
Hot Spare                 : No
Vendor ID                 : DELL    
Product ID                : ST3146755SS     
Revision                  : T107
Serial No.                : 3LN1EF88            
Negotiated Speed          : Not Available
Capable Speed             : Not Available
Manufacture Day           : 07
Manufacture Week          : 24
Manufacture Year          : 2005
SAS Address               : 5000C500047320B9

5 个回答

1

当然可以!请看下面的内容:

这段代码的意思是,它会检查某个条件是否成立。如果条件成立,就会执行一段特定的代码;如果条件不成立,就会执行另一段代码。这种方式在编程中非常常见,因为它可以让程序根据不同的情况做出不同的反应。

简单来说,就像你在生活中做决定一样:如果天气好,你就去外面玩;如果下雨,你就待在家里看书。编程也是这样,通过条件判断来决定接下来要做什么。

希望这个解释能帮助你理解这段代码的作用!

import re

results = []
temp = {}
for item in data:
    (key, value) = re.search('(.*?):(.*)', item).groups()
    if temp.has_key(key): temp = {}
    temp[key] = value
    if temp not in results: results.append(temp)
1

如果你只有“每次重复一个键就表示需要开始一个新的字典”这样的信息,那么你的代码只能稍微改进一下,比如这样:

results = []
curd = {}
for x in data:
  k, v = x.split(':', 1)
  if k in curd:
    results.append(curd)
    curd = {}
  curd[k] = v
results.append(curd)

也就是说,不需要保留一个中间列表 tmp,而是用一个中间字典 curd。这两者的含义有点不同——你只有在键和值都相同时才会开始一个新的字典(比如说,像 'Status:Borked' 这样的项会“覆盖”从 'Status:Ok' 开始构建的项),而我只是把键当作标识符(这样就不会出现覆盖的情况)——你确定你实现的确切含义是你所需要的吗?

9

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,我们可能希望在用户点击一个按钮时,程序才开始运行某段代码。这种情况下,我们就会用到“事件”这个概念。

事件就像是一个信号,告诉程序某件事情发生了。比如,用户点击了按钮、输入了文字,或者移动了鼠标。程序会“监听”这些事件,一旦发生了,就会执行相应的代码。

为了让程序能够处理这些事件,我们通常需要写一些代码来定义这些操作。这就像是给程序设定了一些规则,告诉它在特定情况下该怎么做。

总之,事件处理是让程序与用户互动的重要方式。通过监听和响应事件,程序可以变得更加灵活和智能。

result = [{}]
for item in data:
    key, val = item.split(":", 1)
    if key in result[-1]:
        result.append({})
    result[-1][key] = val

撰写回答