如果 x 不为真,则不要将项目放入列表
Do not put an item in list if x isn't True
我只想在变量为真时向我的列表中添加一个项目,但我想在一行中这样做,以免让我的程序变得更长和糟糕(因为我想对很多变量这样做).假设我想要 return 一个列表,但仅当 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 []
您正在寻找这样的东西。
您想检查是真还是假。但是,return 取决于发送给函数的参数。
您可以做的是将 data1 和 want_data1 配对,然后将 data2 和 want_data2 配对。最好的配对方式是使用 zip。使用 for 循环,该对被拾取。您检查 want_data,如果为真,则将数据作为结果传递。
下面是完成方法。
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,2,True,False))
print ('3,4,False, True', check(3,4,False, True))
print ('5,6,True, True ', check(5,6,True, True))
print ('7,8,False,False', check(7,8,False,False))
这个输出将是:
1,2,True ,False [1]
3,4,False, True [4]
5,6,True, True [5, 6]
7,8,False,False []
您正在使用三元表达式,它们只允许以下语法,等同于 (expr1, expr2)[condition]
expr1 if cond else expr2
即使你尝试 python 短路,如果 x 为假,它仍然会 return 假,当 x 为真时,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]])
我只想在变量为真时向我的列表中添加一个项目,但我想在一行中这样做,以免让我的程序变得更长和糟糕(因为我想对很多变量这样做).假设我想要 return 一个列表,但仅当 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 []
您正在寻找这样的东西。
您想检查是真还是假。但是,return 取决于发送给函数的参数。
您可以做的是将 data1 和 want_data1 配对,然后将 data2 和 want_data2 配对。最好的配对方式是使用 zip。使用 for 循环,该对被拾取。您检查 want_data,如果为真,则将数据作为结果传递。
下面是完成方法。
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,2,True,False))
print ('3,4,False, True', check(3,4,False, True))
print ('5,6,True, True ', check(5,6,True, True))
print ('7,8,False,False', check(7,8,False,False))
这个输出将是:
1,2,True ,False [1]
3,4,False, True [4]
5,6,True, True [5, 6]
7,8,False,False []
您正在使用三元表达式,它们只允许以下语法,等同于 (expr1, expr2)[condition]
expr1 if cond else expr2
即使你尝试 python 短路,如果 x 为假,它仍然会 return 假,当 x 为真时,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]])