使用字典理解将字符串解析为字典的pythonic方法

pythonic way of parsing a string into a dictionary with dict comprehension

对于给定的字符串

key = "test: abc :bcd,ef:1923:g, x : y : z\nkey2 :1st:second\n  etc :values:2,3,4:..."

我想解析字符串以将第一个标记作为键存储到字典中,其余元素作为值列表,类似于以下结果:

{'test': ['abc', 'bcd,ef', '1923', 'g, x', 'y', 'z'], 'key2': ['1st', 'second'], 'etc': ['values', '2,3,4', '...']}

我有


def parseLine(line):
    return list(map(str.strip, line.split(":")))

result = {parseLine(line)[0]:parseLine(line)[1:] for line in str_txt.split('\n')}
print(result)

但是在dict comprehensions的表达式中,函数parseLine被调用了两次,将dict的key和value设置为parseLine(line)[0]:parseLine(line)[1:]

有没有更好的方法来重写字典理解?

import re

s = "test: abc :bcd,ef:1923:g, x : y : z\nkey2 :1st:second\n  etc :values:2,3,4:..."

s = re.sub(r'[^a-z0-9,]',' ',s)

print ({ x.split()[0]:x.split()[1:] for x in s.split("\n") })

输出:

{'test': ['abc', 'bcd,ef', '1923', 'g,', 'x', 'y', 'z'], 'key2': ['1st', 'second'], 'etc': ['values', '2,3,4']}
{lst[0]:lst[1:] for lst in map(lambda s: list(map(str.strip, s.split(":"))), key.split('\n'))}

它给出:

{'test': ['abc', 'bcd,ef', '1923', 'g, x', 'y', 'z'],
 'key2': ['1st', 'second'],
 'etc': ['values', '2,3,4', '...']}

可以在comprehension中使用map来应用函数,然后解构结果。

result = {k: v for k, *v in map(parseLine, str_txt.split('\n'))}

另请注意,如果您仅为此使用 parseLine,则可以重写它而无需转换为 list:

def parseLine(line):
    return map(str.strip, line.split(":"))