如果 x 不为真,则不要将项目放入列表中

问题描述

我只想在变量为真时向我的列表中添加一个项目,但我想在一行中执行此操作,以免使我的程序变得更长和蹩脚(因为我想对很多变量执行此操作)。假设我想返回一个列表,但仅当 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]])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...