使用 if/else 和 for 循环将项目附加到列表推导中的列表

Appending item to list within a list comprehension using if/else and for loop

我已经知道如何根据带有 if 循环的 for 附加一个值,但我想知道是否有优化的方法。

解决方法如下:

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

其中 movies 是一个数据集。

我试过这个:

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 行放在一个句子中吗?

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

要回答您的问题,是的,您的语法有点混乱。将 if 放在 expression 部分的推导式中生成三元。 for 循环中的等价物是:

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

使用if作为过滤器的方法是把它放在comprehension的最后:

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

理解的语法在此处的文档中进行了描述:Python 文档中的 Displays for lists, sets and dictionaries. A ternary is called a conditional expression