我可以从这个列表理解中减少一个strip()调用吗?

时间:2017-10-03 08:51:51

标签: python

[x.strip() for x in multi.splitlines() if len(x.strip()) > 0]

我想知道是否可以仅使用一个.strip()调用来重写此列表理解。这种结构要求我两次打电话。

我无法弄清楚如何在strip()操作中获取multi.splitlines(),因为这是在列表上工作

这不是一个性能关键问题,但只是想知道我是否能够做出更为精简的声明。

4 个答案:

答案 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。在这种情况下,它们的意思完全相同。