使用if / else和for循环将项目追加到列表理解中的列表

时间:2019-12-04 14:44:14

标签: python list list-comprehension syntactic-sugar

我已经知道如何通过if循环根据for附加值,但是我想知道是否有优化的方法来实现它。

这是解决方案:

columm=[]
for i in range(movies.shape[1]): 
    if ((movies.dtypes[i]==float) | (movies.dtypes[i]==int)): 
        columm.append(movies.columns[i])
print(columm)
['title_year', 'aspect_ratio', 'duration', 'duration.1', 'budget', 'imdb_score', 'gross']

电影是数据集。

我已经尝试过:

column=[movies.columns[i] if ((movies.dtypes[i]==float) | (movies.dtypes[i]==int)) else 0 for i in range(movies.shape[1])]

但是结果是:

[0, 'title_year', 0, 'aspect_ratio', 'duration', 0, 0, 'duration.1', 0, 0, 0, 0, 0, 0, 0, 0, 'budget', 'imdb_score', 'gross']

我不得不将 0 放在else句子中,因为没有它,它的标记语法错误。

那么,我可以将这3行放在一个句子中吗?

1 个答案:

答案 0 :(得分:3)

首先,您可以将(x==y) | (x==z)简化为x in (y, z)。另外,建议在逻辑表达式中使用逻辑or而不是按位OR |,但这不重要。

要回答您的问题,是的,您只是对语法有些困惑。将if放在理解的 expression 部分进行三元运算。 for循环中的等效项是:

for i in range(movies.shape[1]):
    columm.append(movies.columns[i] if movies.dtypes[i] in (float, int) else 0)

使用if作为过滤器的方法是将其放在理解的末尾:

column = [movies.columns[i] for i in range(movies.shape[1]) if movies.dtypes[i] in (float, int)]

理解的语法在以下文档中描述:Displays for lists, sets and dictionaries。三元在Python文档中称为conditional expression