代码之家  ›  专栏  ›  技术社区  ›  Aizzaac

如何使用regex从列表填充字典?

  •  0
  • Aizzaac  · 技术社区  · 4 年前

    到目前为止,我可以使用regex提取一些单词。但是我不知道怎么填字典。

    这是我的尝试

    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

    我做了这个循环。尽管它不能正常工作:

    for i in output:
        reg1 = re.search(r'(\w+:)\s(.*)', i)
        if "Model" in i:
            mydict.setdefault("Model", {reg1.group()})
            print(mydict)
    
    3 回复  |  直到 4 年前
        1
  •  1
  •   MrNobody33 Olufemi    4 年前

    你可以试试这个,根据列表 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说明: Dictionary Comprehension 并对列表匹配进行迭代,因此下面是一个使用 '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'
    
        2
  •  1
  •   Milad Yousefi    4 年前

    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'}
    
        3
  •  1
  •   Andrej Kesely    4 年前
    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'}
    
        4
  •  0
  •   blhsing    4 年前

    : 你可以用 str.split

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

    演示: https://repl.it/@blhsing/SnoopyBoringComputationalscience