2015-09-26 22 views
0

如果我们能够使用列表理解,我们可以做得比下面的逻辑更好吗?更好的方法从基于索引的多个列表中删除值使用列表理解

FruitsList = ["apples","mangoes","banana","grapes","peaches","kiwi"] 
numbersList = [1,2,None,5,None,100] 

for num in numbersList: 
    if num == None: 
     indexnum = numbersList.index(None) 
     print indexnum 
     del numbersList[indexnum] 
     del FruitsList [indexnum] 

print FruitsList #['apples', 'mangoes', 'grapes', 'peaches'] 
print numbersList #[1, 2, 5, 4] 
+0

列表有多大?对于更大的列表,移动项目将会很昂贵,更好地创建新列表并将它们分配给相同的变量。 –

+0

如果在产生的FruitsList中有“猕猴桃”而不是“桃子”?看起来你想把水果放在与NumbersList中None无关的位置,但最后一个水果让我困惑? – saulspatz

回答

1

我想你想要的东西,如:

s = [(a, b) for (a,b) in zip(FruitsList, numbersList) if b is not None] 
FruitsList = [x[0] for x in s] 
numbersList = [x[1] for x in s] 

但是这给

['apples', 'mangoes', 'grapes', 'kiwi'] 

的水果,我在我的评论中说。如果这是不正确的,让我知道,我会看到我可以修改这个答案(或删除它)。

编辑:请注意,我不得不改变s从发电机的理解,外括号,以带有方括号的列表理解。生成器理解构建一个生成器,它可以节省内存,速度可能更快,但是只能迭代一次,因此在构建FruitsList之后,生成器是空的,并且当我们尝试再次遍历它以构建numbersList , 它是空的。

+0

@ saulspatz - 我为此道歉的第一件事是我的错误,您提供的输出对于FruitsList 是正确的。第二点 - 当我打印时,numbersList是空列表。 – automationlearner

+0

我是个白痴!我有它的工作,然后我做了一些改变,使其“更高效”,并打破了它。你需要使用列表理解而不是生成器,因为当你迭代一次发生器时,你已经用尽了它。列表理解。另一方面,建立一个列表。我会解决我的答案。 – saulspatz

+0

这次它工作了! – automationlearner

0

也许是一个可以尝试这样的事情

[FruitsList[i] for i in range(0, min(len(FruitsList), len(numbersList))) if not numbersList[i] is None] 
相关问题