Как заполнить словарь из списка с помощью регулярного выражения? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть список («вывод»). Я хочу извлечь из него значения и поместить их в словарь. Пока я могу извлекать некоторые слова с помощью регулярного выражения. Но я не знаю, как наполнить словарь.

ЭТО МОЯ ПОПЫТКА

output = ['labels: imagenet_labels.txt \n', '\n', 'Model: efficientnet-edgetpu-S_quant_edgetpu.tflite \n', '\n', 'Image: img0000.jpg \n', '\n', '----INFERENCE TIME----\n', 'Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.\n', 'time: 6.0ms\n', '-------RESULTS--------\n','results: wall clock\n', 'score: 0.25781\n', '##################################### \n', ' \n', '\n']

mydict = {}

regex1 = re.compile(fr'(\w+:)\s(.*)')
match_regex1 = list(filter(regex1.match, output))
match = [line.rstrip('\n') for line in match_regex1]



СЛОВАРЬ ДОЛЖЕН ВЫГЛЯДИТ ТАК:

{
'Model': "efficientnet-edgetpu-S_quant_edgetpu.tflite",
'Image': "img0000.jpg",
'time': "6.0",
'results': "wall_clock",
'score': :0.25781"
}

СПИСОК ВЫГЛЯДИТ ЭТО:

enter image description here

РЕДАКТИРОВАТЬ

Я сделал это l oop. Хотя он не работает должным образом:

for i in output:
    reg1 = re.search(r'(\w+:)\s(.*)', i)
    if "Model" in i:
        mydict.setdefault("Model", {reg1.group()})
        print(mydict)

Ответы [ 4 ]

1 голос
/ 20 июня 2020

Вы можете попробовать это на основе списка match:

import re
output = ['labels: imagenet_labels.txt \n', '\n', 'Model: efficientnet-edgetpu-S_quant_edgetpu.tflite \n', '\n', 'Image: img0000.jpg \n', '\n', '----INFERENCE TIME----\n', 'Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.\n', 'time: 6.0ms\n', '-------RESULTS--------\n','results: wall clock\n', 'score: 0.25781\n', '##################################### \n', ' \n', '\n']

mydict = {}

regex1 = re.compile(fr'(\w+:)\s(.*)')
match_regex1 = list(filter(regex1.match, output))
match = [line.rstrip('\n') for line in match_regex1]

features_wanted='ModelImagetimeresultsscore'

dct={i.replace(' ','').split(':')[0]:i.replace(' ','').split(':')[1] for i in match if i.replace(' ','').split(':')[0] in features_wanted}
mydict=dct
print(dct)

Вывод:

{'Model': 'efficientnet-edgetpu-S_quant_edgetpu.tflite', 'Image': 'img0000.jpg', 'time': '6.0ms', 'results': 'wallclock', 'score': '0.25781'}

Объяснение dct: Это Понимание словаря и перебирает совпадение со списком, поэтому вот пример итерации с 'Model: efficientnet-edgetpu-S_quant_edgetpu.tflite':

#First check if it is a feature wanted:
i='Model: efficientnet-edgetpu-S_quant_edgetpu.tflite'
i.replace(' ','')
>>>'Model:efficientnet-edgetpu-S_quant_edgetpu.tflite'
i.replace(' ','').split(':')
>>>['Model','efficientnet-edgetpu-S_quant_edgetpu.tflite']
i.replace(' ','').split(':')[0] in features_wanted  #'Model' in 'ModelImagetimeresultsscore'
>>>True
#If it is in features_wanted, an item like this is append to the dictionary:
i.replace(' ','').split(':')[0]:i.replace(' ','').split(':')[1]
>>>'Model':'efficientnet-edgetpu-S_quant_edgetpu.tflite'
1 голос
/ 20 июня 2020
output = ['labels: imagenet_labels.txt \n', '\n', 'Model: efficientnet-edgetpu-S_quant_edgetpu.tflite \n', '\n', 'Image: img0000.jpg \n', '\n', '----INFERENCE TIME----\n', 'Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.\n', 'time: 6.0ms\n', '-------RESULTS--------\n','results: wall clock\n', 'score: 0.25781\n', '##################################### \n', ' \n', '\n']

d = dict( re.findall(r'(\w+):\s*([^\n]+?)\s*$', ' '.join(output), flags=re.M) )

from pprint import pprint
pprint(d)

Печать:

{'Image': 'img0000.jpg',
 'Model': 'efficientnet-edgetpu-S_quant_edgetpu.tflite',
 'Note': 'The first inference on Edge TPU is slow because it includes loading '
         'the model into Edge TPU memory.',
 'labels': 'imagenet_labels.txt',
 'results': 'wall clock',
 'score': '0.25781',
 'time': '6.0ms'}
1 голос
/ 20 июня 2020

для заполнения словаря вы можете использовать этот скрипт:

for item in match:
    key , value = item.split(":")
    mydict[key] = value

, поэтому результат будет примерно таким:

{'labels': ' imagenet_labels.txt ', 'Model': ' efficientnet-edgetpu-S_quant_edgetpu.tflite ', 'Image': ' img0000.jpg ', 'Note': ' The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.', 'time': ' 6.0ms', 'results': ' wall clock', 'score': ' 0.25781'}
0 голосов
/ 20 июня 2020

Поскольку разделителем полей всегда является :, вы можете использовать метод str.split вместо регулярного выражения для большей эффективности:

dict(s.split(': ', 1) for s in map(str.rstrip, output) if ': ' in s)

Demo: https://repl.it/@blhsing / SnoopyBoringComputationalscience

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...