2015-05-14 147 views
0

我想替换列表l1中也在l2中的元素,并删除不在l2中的元素。我不明白为什么以下解决方案不起作用:它返回Python将列表中的元素替换为另一个列表中的列表,并删除其他列表

[33, 33, 'd'] 

代替:

[33, 33, '33'] 

这里是我的解决方案:

l1=['a','b','c', 'd'] 
l2= ['a','b','d','f'] 
for (i,wor) in enumerate(l1): 
    if wor in l2: 
     l1[i]= 33 
    else: 
     del l1[i] 
+0

什么它不工作?这通常有助于看到尝试解决问题。 –

回答

1

添加一些print电话,看看会发生什么:

l1=['a','b','c', 'd'] 
l2= ['a','b','d','f'] 
for (i,wor) in enumerate(l1): 
    if wor in l2: 
     l1[i]= 33 
    else: 
     del l1[i] 
    print(i, len(l1)) 

打印:

0 4 
1 4 
2 3 

根据吨的索引一直要他原来是l1,但在迭代过程中更改了l1的大小。这弄乱了一切。你不应该这样做。

1

使用一组存储l2个元素,只是用33替换集合中的元素:

l1=['a','b','c', 'd'] 
l2= ['a','b','d','f'] 
st = set(l2) 
l1[:] = [33 for ele in l1 if ele in st] 
print(l1) 

您的代码不起作用,因为您正在从要迭代的列表中删除元素。当你del l[i]你已经改变了列表的大小,所以l[i]最初不同于l[i]在删除元素后指向的内容。你不应该从你正在迭代的列表中删除元素,或者从你的输出中看到错误的元素最终会被删除。

如果你开始与你原来的列表:

l1=['a','b','c', 'd'] 
index 0 == a 
index 1 == b 
index 2 == c 
index 3 == d 

然后,如果你删除c然后d是指数2所以你最终错过d

你只需要前和删除后添加打印:

for (i, wor) in enumerate(l1): 
    if wor in l2: 
     l1[i] = 33 
    else: 
     print(l1[i],l1) 
     del l1[i] 
     print(l1[i],l1) 

c [33, 33, 'c', 'd'] 
d [33, 33, 'd'] 

如果添加g到L1,你会看到一个比较明显的错误:

l1=['a','b', "c", 'd',"g"] 
l2= ['a','b','d','f'] 

for (i, wor) in enumerate(l1): 
    if wor in l2: 
     l1[i] = 33 
    else: 
     print(l1[i],l1) 
     del l1[i] 
     print(l1[i],l1) 
print(l1) 

c [33, 33, 'c', 'd', 'g'] 
d [33, 33, 'd', 'g'] 
g [33, 33, 'd', 'g'] 
Traceback (most recent call last): 
    File 
    .......... 
    print(l1[i],l1) 
IndexError: list index out of range 

因为你已经改变了大小不再是l[4]。你的代码没有错误,只是因为l1的最后一个元素碰巧在l2中。

+0

我知道还有其他解决方案可行,但我想了解为什么我的解决方案失败 – Mostafa

1

Padraic的解决方案似乎是要走的路,但是你明白你为什么会遇到问题,你正在修改当你执行del l1[i]步骤时迭代的列表。这将改变循环的下一次迭代中的所有索引,这将不可能做到你想要的。

1

为什么?因为你迭代,并从相同的列表中删除它不工作,l1

考虑迭代时wor = 'c'这里i = 2

在这种迭代,因为'c'没有出现在列表中,您从列表,通过

l1 = [33, 33, 'd'],新的列表中删除。

现在enumerate功能已经达到了它结束,因为没有更多的索引i=2后(如列表l1的长度得到了应有缩成删除)

0

在您的代码中,build_in函数del删除了该列表中的特定值。因此,列表的当前大小减少了一个,即 3.因此循环结束。

这里是一个示例代码来区分方法:

l1=['a','b','c','d'] 
l2= ['a','b','d','f']  
i=0 
for wor in l1: 
    print wor 
    if wor in l2: 
     print 'id' 
     l1[i]= 33 
    else: 
     #del l1[i] 
     l1[i]='' 
     print 'del' 
    i+=1 


print l1 
print l2 

a

b

c

del

d

[33, 33, '', 33]

['a', 'b', 'd', 'f']

相关问题