我有一个看似简单的问题,但我认为应该解决它的代码并不像预期的那样 - 但是我发现功能上等效的代码不那么优雅。你能帮我理解吗?
任务:创建一个列表,删除一个特定的值。 具体的用例是我正在删除pd.df列的特定列表,但这不是我想要关注的部分。我似乎无法在一个漂亮的pythonic单行操作中做到这一点。
我认为应该有效:
result = list(df.columns).remove(x)
这会导致'NoneType'类型的对象
但是,以下工作正常:
result = list(df.columns)
result.remove(X)
这些看起来在功能上与我相当 - 但最重要的方法更清晰,更受欢迎,但它不起作用。为什么?
答案 0 :(得分:3)
原因是remove
更改了列表,并且没有返回新列表,因此您无法将其链接。
以下方法怎么样?
result = [item for item in df.columns if item != x]
请注意,此代码完全与您提供的代码完全相同,因为它会删除所有x
,而不仅仅是remove(x)
的第一个代码。
答案 1 :(得分:2)
这些绝对不是功能相同的。
remove
返回什么。 remove
总是返回None,因为它什么都不返回。remove
的回报。 要做的等同和错误将是:
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
。