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

359 天前
 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 反而不好写了。

请问大家有啥好的建议?

谢谢

3366 次点击
所在节点    Python
47 条回复
zhouxiaoyuan
358 天前
@zhouxiaoyuan 对了,应该用 OrderedDict([('foo', 1), ('bar', 2), ('spam', 3), ('grok', 4)])
cornetCat
358 天前
就 if else 挺好的,可读性好,打断点调试方便
yucongo
358 天前
names = ["Andy", "Jack", "Jim"]
_ = [*map(lambda x: x in long_string, names)]
idx = _.index(True) if True in _ else len(_)
print(my_dict[list(my_dict)[idx]])

坚持用 map 的话试试这个
fgwmlhdkkkw
358 天前
match
fgwmlhdkkkw
358 天前
yucongo
358 天前
def f(long_string):
names = ["Andy", "Jack", "Jim"]
_ = [*map(lambda x: x in long_string and (True if x not in ['Jim'] else 'Mike' not in long_string), names)]
idx = _.index(True) if True in _ else len(_)
return my_dict[list(my_dict)[idx]]

assert f('Andy...') == 'string1'
assert f('AndyJack...') == 'string1'
assert f('JackAndy...') == 'string1'
assert f('JackAndyJim...') == 'string1'
assert f('AndyJimMike...') == 'string1'

assert f('Jim...') == 'string3'
assert f('JimMike...') == 'string4'

assert f('xyz...') == 'string4'


‘Jim’ 加上 'Mike' not in long_string 条件
xzm429438709
338 天前
真的如果单纯为了炫技,那可以,如果生产用,前往不要,if else 可读性最高,应届生来了都能接手,你搞的花里胡哨,性能提升了多少?如果不是,为什么搞?单纯为了装逼吗?减少代码行数?你底层最终的字节码,还不是 if else

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

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

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

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

© 2021 V2EX