压缩具有相同输出的python列表

压缩具有相同输出的python列表,python,performance,Python,Performance,我是一个新手,努力提高效率 if age >= 35: age_val = True else: age_val = False if born == "yes" or "Yes": born_val = True else: born_val = False if resident >= 14: res_val = True else: res_val = False 如您所见,所有这些检查都有相同的输出。有没有办法把if/e

我是一个新手,努力提高效率

if age >= 35:
    age_val = True
else:
    age_val = False

if born == "yes" or "Yes":
    born_val = True
else:
    born_val = False

if resident >= 14:
    res_val = True
else:
    res_val = False 
如您所见,所有这些检查都有相同的输出。有没有办法把if/else语句浓缩成这样

if age >= 35, born == "yes" or "Yes, resident >= 41:
     age_val, born_val, res_val = True
else:
     age_val, born_val, res_val = True
我知道python不是这样工作的,但也许它也有类似的功能?

我不会担心性能。我认为你真正想要的是清晰

首先,每当你看到:

if condition:
    result = True
else:
    result = False
您可以将其替换为:

result = condition
那么比如说,

if age >= 35:
    age_val = True
else:
    age_val = False
变成

age_val = age >= 35
对其余的进行同样的操作可以得到:

age_val = age >= 35
born_val = born == "yes" or born == "Yes"
res_val = resident >= 14
但是为什么我们把这些称为
\u val
s?最好是在前面加上
is\uu

is_old_enough = age >= 35
is_born = born == "yes" or born == "Yes"
is_long_term_resident = resident >= 14
然后:

meets_criteria = (
    is_old_enough and
    is_born and
    is_long_term_resident
)

if meets_criteria:
    print("35+ years old resident of over 14 years was born at some point")

您可以通过简单的一行程序实现这一点

age\u val,born\u val,res\u val=int(age)>=35,born.lower()='yes',int(常驻)>=14

每个条件if用逗号分隔,并将等效于

age_val = int(age) >= 35
born_val = born.lower() == 'yes'
res_val = int(resident) >= 14

你需要用字典可以吗?如果是,您可以这样做:

data = {
    'age_val': age >= 35,
    'born_val': born == "yes",
    'res_val': resident >= 14
}

要从这样的dict中检索数据,可以使用
get()
,因此这个
data.get('age_val')
将产生
True
False
,取决于
resident
值。

如果年龄>=35,则可以使用
age\u val=True,否则为False
@OsmanMamun或
age\u val=age>=35
。我总是忘记python隐含的真实性variables@OsmanMamun这不是重点。
=
运算符直接返回
True
False
。您为什么要编写一行呢?@MateenUlhaq I显示了两个示例,如用户示例中所述,他们试图在一条语句中将3个变量设置为True<代码>年龄、出生、恢复=真这是可行的。关于在一行中处理这个问题,我有没有遗漏什么突出的缺点?这使我更容易在更大的部分中思考代码。这被认为是不好的做法吗?至少,它打破了PEP8的80字符行长度限制,但主要问题是它在视觉上将分配给它的变量与其值分开,从而影响可读性。大多数经验丰富的开发人员几乎总是避免使用这种模式,除非是为了元组解包:
pos=(1,2);x、 y=位置
。或者交换:
a,b=b,a
bool()
在这种情况下将
bool
s转换为
bool
s。可以使用索引符号而不是方法语法访问字典键:
数据[“age\u val]”
是的,你说得对-我已经编辑了我的答案。关于第二条评论——你也是对的,但我更喜欢使用
get()
,因为它可以防止你出现
KeyError
,并让你提供回退值。啊!非常感谢!我有另一个变量valid,它等价于满足_标准。