如何用 map 和 re 来优化下面的 if..else..

2023-06-23 14:02:13 +08:00
 ladypxy

代码如下

long_string ="blablabl"

my_dict = {"a": "string1", "b": "string2" , "c": "string3", "d":"string4"}

if "Andy" in long_string:
    return mydict["a"]
elif "Jack" in long_string:
    return mydict["b"]
elif "Jim" in long_string and "Mike" not in long_string:
    return mydict["c"]
else:
    return mydict["d"]

感觉这样效率有点低,感觉用 map 处理比较好。但是条件 3 实际上是 2 个条件,这样用 map 反而不好写了。

请问大家有啥好的建议?

谢谢

3616 次点击
所在节点    Python
47 条回复
BeautifulSoap
2023-06-23 14:58:05 +08:00
写个循环遍历 long_string ,一次循环就能判定了
ladypxy
2023-06-23 15:03:25 +08:00
@BeautifulSoap 一次?求范例,谢谢
westoy
2023-06-23 15:10:10 +08:00
就就几个条件, 这样写挺好的
ccde8259
2023-06-23 15:16:16 +08:00
为什么是 map 和 re 而不是 DFA 啊……
luozic
2023-06-23 15:36:15 +08:00
原始需求是啥? 你这算字符串转义?
ladypxy
2023-06-23 15:51:33 +08:00
@luozic 需求就是查询字符串 long_string 里有没有指定的字符串,然后返回字典的数值。
要求用 map 和 re 解决
LoNeFong
2023-06-23 15:59:25 +08:00
long_string = "blablabl"

my_dict = {"a": "string1", "b": "string2", "c": "string3", "d": "string4"}

result = my_dict["a"] if "Andy" in long_string else my_dict["b"] if "Jack" in long_string else my_dict["c"] if "Jim" in long_string and "Mike" not in long_string else my_dict["d"]

result
tairan2006
2023-06-23 16:07:56 +08:00
让 gpt 优化就行 专业对口
BeautifulSoap
2023-06-23 16:16:18 +08:00
@luozic 看了 lz 的回复有一点不太明白了,你想改善的到底是那一坨 if 的判断逻辑,还是想改善那一坨 if 里的多个 in 查找?
JasonLaw
2023-06-23 16:19:57 +08:00
@LoNeFong #7 这代码没有一点可读性🤕
ladypxy
2023-06-23 16:37:38 +08:00
@BeautifulSoap 就是不要用 if 而是用 map 来实现
blankmiss
2023-06-23 16:41:12 +08:00
gpt 给的答案 def get_value(long_string):
string_map = {
"Andy": "string1",
"Jack": "string2",
"Jim": "string3",
"Mike": "not_found",
}

return next(map(lambda key: string_map[key], filter(lambda key: key in long_string and (key != "Jim" or "Mike" not in long_string), string_map)), "string4")

可是这样真的好吗
Jakarta
2023-06-23 16:49:27 +08:00
@blankmiss 优雅,俺们 v2 就是追求这样的代码
lhbc
2023-06-23 16:56:34 +08:00
先遍历找出所有的关键词是否存在,存到一个字典里,然后判断返回

但没必要这样优化
你的逻辑是满足其中一个条件就 return 了,其他都没必要找
先找出所有的反而效率低

除非你的字符串极长
ladypxy
2023-06-23 16:56:40 +08:00
@tairan2006 试了下,需要多次才能给出差不多的答案,但是个人感觉这种可读性还不如 if else

import re

long_string = "blablabl"

my_dict = {"a": "string1", "b": "string2", "c": "string3", "d": "string4"}

keyword_mapping = {
"Andy": "a",
"Jack": "b",
"Jim": "c",
"Mike": "d"
}

matched_keywords = set(filter(lambda x: re.search(x, long_string) is not None, keyword_mapping.keys()))
matched_values = [my_dict[keyword_mapping[keyword]] for keyword in matched_keywords]

if "Jim" in matched_keywords and "Mike" not in matched_keywords:
result = my_dict[keyword_mapping["Jim"]]
else:
result = matched_values[0] if matched_values else my_dict["d"]

print(result)
Pastsong
2023-06-23 17:08:06 +08:00
不可读吗?比正则可读吧
liantian
2023-06-23 17:23:41 +08:00
看了楼上各种解决方案…

还是原始方案最可读啊。
qwq11
2023-06-23 17:35:24 +08:00
luozic
2023-06-23 17:36:52 +08:00
@BeautifulSoap 看这 lz 还是有点故意把能优化成 DFA 的,用 re+map 处理? 关键这种字典映射,只取一个就返回?
luozic
2023-06-23 17:43:44 +08:00
https://paste.ubuntu.com/p/pFwm9WPymf/
@qwq11 拼写单词错误,语法错误

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/951017

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX