问题描述
因此,考虑到我必须根据条件将值添加到数组的情况。 我意识到,使用三元运算符也不会赋值。 考虑这种情况:
req_array = []
req_dict={'a':1,'b':2,'c':3}
if req_dict.get("a"):
req_array.append(req_dict['a'])
if req_dict.get("d"):
req_array.append(req_dict['d'])
if req_dict.get("c"):
req_array.append(req_dict['c'])
另一种方法是:
req_array.append(req_dict['a']) if req_dict.get('a') else None
req_array.append(req_dict['d']) if req_dict.get('d') else None
req_array.append(req_dict['c']) if req_dict.get('c') else None
它们两者都能正常工作。但是,我很好奇在这种情况下推荐的方法是什么?
解决方法
我认为使用条件运算符来处理副作用与使用列表推导来处理副作用大致相同。这些是旨在产生某种东西的表达式,而您在忽略它们产生的东西时正在使用它们来做其他事情(在这种情况下,始终为None
。
如果您真的需要单行,可以随时进行
if req_dict.get('a'): req_array.append(req_dict['a'])
尽管样式仍然不是很好(可读两行),但完全合法,不那么冗长(添加:
,删除 else None
),并不意味着产生未使用的值,即使if
失败也是如此。使用3.8,海象运算符甚至可以使您避免执行两次查找,同时仍然允许您将其单行执行:
if val := req_dict.get('a'): req_array.append(val)
,
正如您所指出的,这两个选项都有效,因此大多数情况下都是个人风格问题。
就我个人而言,我发现这样的三元表达式更难以阅读-它们以声明某些内容将添加到列表开头开始,但是当您继续阅读时,发现它可能不是由于某些情况而引起的。我肯定会采用明确的if
方法。
有许多方法可以实现此目标,具体取决于您要寻找的内容。 条件总是一样吗?然后,您可以定义一个键列表并对其进行迭代。
keys = ['a','b','c']
req_array = []
req_dict={'a':1,'b':2,'c':3}
for key in keys:
val = req_dict.get(key)
if val: # your condition here
req_array.append(val)
或一支班轮:
req_array += [req_dict[key] for key in keys if req_dict.get(key)]
有许多适当的方法。有些只是偏爱问题。
如果所有键的条件都不相同,那么我会选择显式if
,因为这样更易于阅读,并且可以立即识别出模式。