问题描述
我只想在变量为真时向我的列表中添加一个项目,但我想在一行中执行此操作,以免使我的程序变得更长和蹩脚(因为我想对很多变量执行此操作)。假设我想返回一个列表,但仅当 x
等为真时才在其中包含项目。
我想使用不会向列表中添加任何数据的东西,因为 None 被视为一个项目。
# Note: The variables name may change,so please make it compatible.
return [data1 if x else None,data2 if y else None]
<< x = False,y = False = [None,None],I want []
示例
# User choose if he wants data(x) by changing the default value of want_data(x)
def func(want_data1=True,want_data2=True):
return [data1 if want_data1 else None,data2 if want_data2 else None]
print(func(False,False))
<< [None,None] # Not what I want! Excepted output is []
解决方法
您正在寻找这样的东西。
您想检查 True 或 False。但是,返回值取决于发送给函数的参数。
您可以做的是将 data1 和 want_data1 配对,并将 data2 和 want_data2 配对。配对的最佳方式是使用 zip。使用 for 循环,这对被选中。您检查 want_data,如果为 True,则作为结果传递数据。
以下是完成它的方法。
def check(data1,data2,x,y):
return [a for a,b in zip((data1,data2),(x,y)) if b]
print ('1,2,True,False',check(1,False))
print ('3,4,False,True',check(3,True))
print ('5,6,True ',check(5,True))
print ('7,8,check(7,False))
输出结果为:
1,False [1]
3,True [4]
5,True [5,6]
7,False []
,
您正在使用三元表达式,它们只允许使用以下语法,相当于 (expr1,expr2)[condition]
expr1 if cond else expr2
即使你尝试python短路,如果x为false,它仍然会返回False,当x为True时返回data1。
[x and data1,y and data2]
对于您的情况,您必须在创建的三元操作之上执行 list comprehension
-
data1 = 'hi'
data2 = 'there'
x,y = True,False
[i for i in [data1 if x else None,data2 if y else None] if i]
['hi']
使用上述方法进行最少修改的函数:
def func(want_data1=True,want_data2=True):
l = [data1 if want_data1 else None,data2 if want_data2 else None]
return [i for i in l if i]
替代方法 - 如果您对 numpy 持开放态度,那么屏蔽列表非常容易,然后试试这个:
import numpy as np
def func(want_data1=True,want_data2=True):
return np.array([data1,data2])[[want_data1,want_data2]].tolist()
用字典 -
import numpy as np
def func(want_data1=True,want_data2=True):
d = {'data1': data1,'data2': data2}
return dict(np.array(list(d.items()))[[want_data1,want_data2]])