[x.strip() for x in multi.splitlines() if len(x.strip()) > 0]
我想知道是否可以仅使用一个.strip()
调用来重写此列表理解。这种结构要求我两次打电话。
我无法弄清楚如何在strip()
操作中获取multi.splitlines()
,因为这是在列表上工作
这不是一个性能关键问题,但只是想知道我是否能够做出更为精简的声明。
答案 0 :(得分:1)
在过滤器中使用str.isspace
,而不是检查字符串是否只包含空白字符:
[x.strip() for x in multi.splitlines() if x and not x.isspace()]
str.isspace
也更快,因为它不会创建新字符串来检查其长度。
此外,您可以先删除字符串,然后保留非空字符串:
[x for x in map(str.strip, multi.splitlines()) if x]
答案 1 :(得分:1)
或者您可以使用filter
:
filter(len, [x.strip() for x in lines])
这将实现您想要的相同功能:首先删除所有字符,然后删除空字符串。
答案 2 :(得分:0)
每当您从计算结果中创建列表理解时,您也希望在条件中使用,一个好的通用方法是使用生成器来执行计算。在你的情况下,计算是public class RecipeAdapter extends FirebaseRecyclerAdapter<RecipeObject, RecipeHolder>{
private static final String TAG = RecipeAdapter.class.getSimpleName();
private Context context;
public RecipeAdapter(Class<RecipeObject> modelClass, int modelLayout, Class<RecipeHolder> viewHolderClass, DatabaseReference ref, Context context) {
super(modelClass, modelLayout, viewHolderClass, ref);
this.context = context;
}
@Override
protected void populateViewHolder(RecipeHolder viewHolder, RecipeObject model, int position) {
viewHolder.recipeName.setText(model.getRecipename());
Glide.with(context).load(model.getRecipeImageUrl()).into(viewHolder.recipeImage);
}
}
,所以你要从一个生成器开始,从字符串中删除空格:
strip()
然后你可以建立你的列表理解:
(x.strip() for x in multi.splitlines())
在这种情况下,[y for y in (x.strip() for x in multi.splitlines()) if len(y) > 0]
是一个足够简单的计算,如果你使用这个方法它并不重要,但是当你的计算花费很长时间和/或大量资源时它会派上用场并且你不希望每个元素多做一次。
答案 3 :(得分:0)
一种选择是将另一个理解或生成器表达式嵌套在当前的表达式中。外部表达式将为内部表达式产生的值指定一个名称,因此您不需要重复的表达式(例如方法调用):
[x for x in (y.strip() for y in multi.splitlines()) if x]
请注意,我使用的是if x
而不是if len(x) > 0
。在这种情况下,它们的意思完全相同。