我有一个列表列表:
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
上进行迭代,所以我不明白为什么我的代码不会工作。
我在做什么错了?
答案 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]]