使用字典中的键字符串替换字符串中的值的列表理解

2024-09-24 02:24:31 发布

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

请求一点帮助。 此函数用标准拼写替换缩写词。我试着用列表替换第3-6行。我试过这个:

words[i] = [key for i, word in enumerate(words) for key, value in abbrevs.items()
            if word == abbrevs[key]] 

def text_deciphered(text_message, abbrevs):
    words = text_message.split()
    for i, word in enumerate(words):
        for key in abbrevs.keys():
            if word == abbrevs[key]:
                words[i] = key    
    words = ' '.join(words)
    return words

text_message = "Hey, wat r our plans for tn"
abbrevs = {"what": "wat", "are": "r", "tonight": "tn"}
print(text_deciphered(text_message, abbrevs))

但它只返回abbrevs中的键-今晚是什么


Tags: key函数textinmessagefor标准if
1条回答
网友
1楼 · 发布于 2024-09-24 02:24:31

首先,字典背后的思想是基于键查找值,而不是相反。这保证了即时查找,而不是像您正在做的那样转储所有条目并逐个查找它们。从反转dict:abbrevs = {v: k for k, v in abbrevs.items()}开始,或者在继续之前从一开始就正确地构建它

调整之后,可以使用列表理解和^{}实现简单的一行程序。如果element不在字典中,则回退值为element本身:

>>> text_message = "Hey, wat r our plans for tn"
>>> abbrevs = {"wat": "what", "r": "are", "tn": "tonight"}
>>> " ".join([abbrevs.get(x, x) for x in text_message.split()])
'Hey, what are our plans for tonight'

因此,您的功能是:

def text_deciphered(text_message, abbrevs):
    return " ".join([abbrevs.get(x, x) for x in text_message.split()])

请注意split相当于\s+,因此您可能会无意中压缩空白。我更愿意将re.sub与lambda一起应用于每个单词:

>>> import re
>>> text_message = "Hey,   wat   r our plans for tn"
>>> abbrevs = {"wat": "what", "r": "are", "tn": "tonight"}
>>> re.sub(r"(\w+)", lambda x: abbrevs.get(x.group(), x.group()), text_message)
'Hey,   what   are our plans for tonight'

相关问题 更多 >