2009-12-23 3 views
3

Только начинаю с питона и знаю достаточно, чтобы знать, что ничего не знаю. Я хотел бы найти альтернативные способы разделения списка на список dicts. Список Пример:Python: Разделить список в список dicts?

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'] 

Закончено список dicts:

[{'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'}] 

Этот список повторяющихся элементов, которые требуют несколько dicts и список изменяется в длину. Мой код кажется, что он может быть упрощен, если бы я только знал 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 
+0

Можете ли вы предположить, что каждый элемент будет иметь ровно пять пунктов ID, статус, имя, состояние, failurePredicted? – Smashery

+0

Что есть в данных ??? как вы получили данные? из файла ?? показать формат файла, если он доступен – ghostdog74

+0

@Smashery, no. количество предметов отличается. – CarpeNoctem

ответ

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

Обратите внимание, что 'result [-1]' означает «последний элемент» - с использованием отрицательных индексов отсчет со спины. – Smashery

+0

Так будет ли это то, о чем люди говорят, когда говорят «pythonic»? Это лаконично и прекрасно работает. – CarpeNoctem

+0

Да, я бы описал это как «pythonic». Вместо хранения временных переменных все помещается прямо в список результатов. – Smashery

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) 
+0

Это создает список списков, в конце концов, мне понравится список dicts для более легкого анализа позже. – CarpeNoctem

+0

отредактировано с помощью dicts вместо списков – mkotechno

1

Если нет больше информации, чем «каждое повторение ключевого сигнала о необходимости начать новую Dict», код может быть улучшено лишь незначительно, например, как:

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 семантика немного отличается. - вы начать новый Dict только когда оба ключа и значения совпадают (так что элемент, как 'Status:Borked' бы «попирать» одно существо например, построено из 'Status:Ok'), я беру ключ только как идентификатор (так, в этом случае не попирать) - вы уверены точная семантика, которую вы внедряете, - это то, что вам нужно?

+0

Конечно, это сильное слово, что я далек от этого - это мой первый скрипт python. Я бы хотел, чтобы список dicts упростил итерацию позже. Я не хотел вставлять весь скрипт, поскольку он, возможно, испугал вас, полезных людей. – CarpeNoctem

+0

Да, «каждое повторение ключа сигнализирует о необходимости запуска нового dict», так как количество элементов key: value в списке может измениться. Это то, что я пытался написать, но не совсем там. Благодарю. – CarpeNoctem

0
ret = [] 
ITEMS_AMOUNT = 5 
while True: 
     tmp = {} 
     for i in data[0:ITEMS_AMOUNT]: 
       tmp.update(dict([i.split(':', 1)])) 
     ret.append(tmp) 

     if len(data) == ITEMS_AMOUNT: 
       break 
     data = data[ITEMS_AMOUNT:] 

print ret 
0
d=dict([]) 
c=0 
whatiwant=["ID","Status","Name","State","Failure Predicted"] 
for line in open("file"): 
    line=line.rstrip() 
    sline=line.split(":",1) 
    sline[0]=sline[0].strip() 
    if sline[0]=="ID": 
     c+=1 
     d.setdefault(c,[]) 
    if sline[0] in whatiwant: 
     d[c].append((sline[0],' '.join(sline[1:]))) 
for i,j in d.iteritems(): 
    print i,j 

выход

$ ./python.py 
1 [('ID', ' 0:0:0'), ('Status', ' Ok'), ('Name', ' Physical Disk 0:0:0'), ('State', ' Online'), ('Failure Predicted', ' No')] 
2 [('ID', ' 0:0:1'), ('Status', ' Ok'), ('Name', ' Physical Disk 0:0:1'), ('State', ' Online'), ('Failure Predicted', ' No')] 
Смежные вопросы