为什么list.remove()在此for循环中不起作用?

时间:2019-04-26 15:16:00

标签: python list

我有一个列表列表:

import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = 'Angular';
  objectKeys = Object.keys;
  myObject = { 
   'France': false,
   'Morocco': true,
   'US': false,
   'India': false
  }

  getSelected(){
    for(const key in this.myObject){
      if(this.myObject[key] === true) return key;
    }
  }

  selectCountry(evt){
    this.getNightlyType(evt.target.value);
  }

  getNightlyType(country: any) {
    for (let element in this.myObject) {
      if (element !== country) {
        this.myObject[element] = false;
      } else {
        this.myObject[element] = true;
      }
    }
  }
}

我要从W = [[5.0, 0, 0, 0, 0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]] 中的每个列表中删除零个条目。

我尝试了以下方法:

W

但是它将始终返回

for idx in range(len(W)):
    W[idx].remove(0)
print(W)

这里没有任何变化。我知道以下事实:在迭代对象时无法更改对象,但是由于我不是在[[5.0, 0, 0, 0, 0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]] 上而是在W上进行迭代,所以我不明白为什么我的代码不会工作。

我在做什么错了?

7 个答案:

答案 0 :(得分:6)

正如avloss所说,remove只会删除第一个匹配项。进行列表理解。

for idx in range(len(W)):
    W[idx] = [i for i in W[idx] if i != 0]
print(W)

并按照@meowgoesthedog的建议,您可以进行整体列表理解:

W = [lst[item for item in lst if item !=0] for lst in W]

答案 1 :(得分:2)

如果要删除所有0元素,则可以使用用户列表理解和过滤器:

W = [[5.0, 0, 0, 0, 0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
for idx in range(len(W)):
    W[idx] = [i for i in W[idx] if i != 0]
print(W)

输出看起来像这样:

[[5.0], [5.0], [], [5.0], [5.0]]

答案 2 :(得分:2)

您可以使用列表理解和过滤功能删除W的每个子列表中值为零的项目:

W = [[5.0, 0, 0, 0, 0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
nw = [list(filter(lambda a: a != 0, k)) for k in W]

输出

[[5.0], [5.0], [], [5.0], [5.0]]

答案 3 :(得分:2)

我想说最好是将过滤器与lambda表达式一起使用,以过滤出零值。

    for idx in range(len(W)):
        W[idx]=list((filter(lambda a: a != 0, W[idx])))
        print(W)

这将为您提供下一个输出:

    [[5.0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
    [[5.0], [5.0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
    [[5.0], [5.0], [], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
    [[5.0], [5.0], [], [5.0], [5.0, 0, 0, 0]]
    [[5.0], [5.0], [], [5.0], [5.0]]

答案 4 :(得分:1)

一个简单的列表理解就足够了。

W = [[5.0, 0, 0, 0, 0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
li  = [ [j] for i in W for j in i if j!=0]
print(li)
#[[5.0], [5.0], [5.0], [5.0]]

答案 5 :(得分:0)

由于每个子列表中的零个以上,因此,如果您要坚持使用基于循环的解决方案,则必须使用两个for循环。

In [75]: for lst in W:
    ...:     num_zeros = lst.count(0)
    ...:     for _ in range(num_zeros):
    ...:         lst.remove(0)


In [76]: W
Out[76]: [[5.0], [5.0], [], [5.0], [5.0]]

现在,您的代码:

In [79]: for idx in range(len(W)):
    ...:     W[idx].remove(0)
    ...: print(W)

得出解决方案:

[[5.0, 0, 0, 0], [5.0, 0, 0], [0, 0], [5.0, 0, 0], [5.0, 0, 0]]

我们可以看到,输入列表中的零计数中缺少1个零。这是因为remove(obj)将仅删除该对象的第一次出现。

答案 6 :(得分:-2)

这是因为l.remove(0)表示删除该元素的首次出现。要按索引删除元素,可以使用del

W = [[5.0, 0, 0, 0, 0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
for idx in range(len(W)):
    del W[idx][0]
print(W)

这产生

[[0, 0, 0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0, 0]]