这是我第二次遇到这种代码:
if "associé" in gender or "gérant" in gender or "président" in gender or "directeur" in gender:
gen = "male"
elif "associée" in gender or "gérante" in gender or "présidente" in gender or "directrice" in gender:
gen = "female"
else:
gen = "error"
我想找到一种更有效的方法来编写这段代码,因为它看起来非常糟糕。
答案 0 :(得分:4)
我个人喜欢用sets
来做这件事。例如:
opts = ["associé", "gérant", "président", "directeur"]
if set(opts) & set(gender):
...
&
用于集合交集操作,该操作返回一个新set
,其中包含&
任一侧的集合共享的项目。仅当if
和gender
中存在重叠时,才会执行opts
块。您也可以为elif
重复此过程,创建可能选项的列表,并检查该列表与gender
之间的重叠。总之,你可以这样做:
male_opts = ["associé", "gérant", "président", "directeur"]
female_opts = ["associée", "gérante", "présidente", "directrice"]
if set(male_opts) & set(gender):
gen = "male"
elif set(female_opts) & set(gender):
gen = "female"
else:
gen = "error"
此外,正如 @Copperfield 指出的那样。您可以通过将*_opt
变量(甚至可能是gender
集开头来提高效率:
male_opts = {"associé", "gérant", "président", "directeur"}
female_opts = {"associée", "gérante", "présidente", "directrice"}
gender = set(gender)
if male_opts & gender:
...
上面的代码假设gender
是一个可迭代的,但从注释中可以看出它是一个字符串(例如,'associé gérant'
。虽然此时接受的答案更好,但你可以仍然使用此解决方案,使gender
组成字符串的一组单词:
gender = set(gender.split())
答案 1 :(得分:4)
使用列表和any
:
males = ["associé", "gérant", "président", "directeur"]
females = ["associée", "gérante", "présidente", "directrice"]
if any(m in gender for m in males):
gen = "male"
elif any(m in gender for m in females):
gen = "female"
else:
gen = "Error"
答案 2 :(得分:0)
如果你不能在一个gender
字符串中有多个这些蜇,可能是这样的吗?
gen = "error"
for g in ["associé", "gérant", "président", "directeur"]:
if g in gender:
gen = "male"
break
for g in ["associée" "gérante", "présidente", "directrice"]:
if g in gender:
gen = "female"
break