根据文件中模式匹配的键和值形成python字典

2024-06-25 23:19:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个字典,其中包含基于匹配模式的文本文件。包含key_str的行应成为键,后续行应成为字典中与这些键关联的值

文件:

ml1
/core
/home

ml2
/var
/home
/lib

cpuml1
/home
/root
/raid

预期产量

my_dict: {ml1: ['/core','/home'], ml2: ['/var','/home','/lib'], cpuml1: ['/home','/root','/raid']}

代码:

d = {}
key_str = "ml"
val_str = ""
key_list = []
val_list = []
with open(homedir+'/backup/file2dict.result') as file2dict:
    for line in file2dict:
        words=line.split()
        for aWord in words:
            if key_str in aWord:
                key_list.append(aWord)
                print(key_list)
            else:
                val_list.append(aWord)
    print("this is formed dictionary", d)

Tags: keyincorehome字典varlibval
3条回答

以下是一种方法:

#! /usr/bin/env python3
keystr="ml"
k=''
d = {}
with open ("testp.txt") as file2dict:
    for line in file2dict:
        li = line.strip()
        # This uses your keystr, but you could say if not line.startswith("/"):
        if keystr in li:  
            k = li
        elif li and k:
            d[k] = d.get(k,[]) + [li]
        
print(d)

每当遇到新的键时,将现有的val_列表添加到最后一个键并擦除val_列表

key_str = "ml"
val_str = ""
val_list = []
key = ''
d = {}
with open(homedir + '/backup/file2dict.result') as file2dict:
    for line in file2dict:
        words = line.split()
        for aWord in words:
            if key_str in aWord:
                if key:
                    d[key] = val_list
                    val_list = []
                    key = aWord
                else:
                    key = aWord
            else:
                val_list.append(aWord)
    d[key] = val_list

    print("this is formed dictionary", d)

假设输入格式正确,每个块之间有双换行符,每个块以一个键名开始,块中的每一行都是该键的值,每个键在文件中是唯一的,并且假设ml2键的意思是['/var','/home', '/lib'],则可以通过理解创建结果:

with open(file) as f:
    result = {key:lst for key, *lst in (block.split('\n') for block in f.read().split('\n\n'))}

使用多行字符串而不是文件进行测试:

>>> s = '''ml1
... /core
... /home
...
... ml2
... /var
... /home
... /lib
...
... cpuml1
... /home
... /root
... /raid'''
>>> {key:lst for key, *lst in (block.split('\n') for block in s.split('\n\n'))}
{'ml1': ['/core', '/home'], 'ml2': ['/var', '/home', '/lib'], 'cpuml1': ['/home', '/root', '/raid']}

相关问题 更多 >