Pythonic方式不使用列表

时间:2018-04-11 09:00:15

标签: python list

我有一个看似简单的问题,但我认为应该解决它的代码并不像预期的那样 - 但是我发现功能上等效的代码不那么优雅。你能帮我理解吗?

任务:创建一个列表,删除一个特定的值。 具体的用例是我正在删除pd.df列的特定列表,但这不是我想要关注的部分。我似乎无法在一个漂亮的pythonic单行操作中做到这一点。

我认为应该有效:

result = list(df.columns).remove(x)

这会导致'NoneType'类型的对象

但是,以下工作正常:

result = list(df.columns)
result.remove(X)

这些看起来在功能上与我相当 - 但最重要的方法更清晰,更受欢迎,但它不起作用。为什么?

3 个答案:

答案 0 :(得分:3)

原因是remove更改了列表,并且没有返回新列表,因此您无法将其链接。

以下方法怎么样?

result = [item for item in df.columns if item != x]

请注意,此代码完全与您提供的代码完全相同,因为它会删除所有x,而不仅仅是remove(x)的第一个代码。

答案 1 :(得分:2)

这些绝对不是功能相同的。

  1. 第一段代码将最后一个被调用方法的结果放入结果中,因此无论remove返回什么。 remove总是返回None,因为它什么都不返回。
  2. 第二段代码将列表放入结果中,然后从列表中删除(已存储在结果中)该项目。你正在丢弃remove的回报。 要做的等同和错误将是:
  3. result = list(df.columns)
    result = result.remove(X)
    

答案 2 :(得分:1)

这两段代码并不是真正等效的。在第二个中,变量public void inrequestadd() { mInterstitial = new InterstitialAd(MainActivity.this); mInterstitial.setAdUnitId(getString( R.string.INTRESTITIAL_ID)); mInterstitial.loadAd(new AdRequest.Builder().build()); mInterstitial.setAdListener(new AdListener() { @Override public void onAdClosed() { super.onAdClosed(); } @Override public void onAdFailedToLoad(int errorCode) { super.onAdFailedToLoad(errorCode); } @Override public void onAdLoaded() { super.onAdLoaded(); if (mInterstitial.isLoaded()) { mInterstitial.show(); } } }); } 保存您的列表。然后,您在该列表上调用result,并删除该元素。到目前为止一切都很好。

在第一段代码中,您尝试将remove的返回值分配给结果,因此这将与以下内容相同:

remove()

由于result = list(df.columns) result = result.remove(X) 没有返回值,因此结果为remove