Python替换列表中也在另一个列表中的元素,并删除其他元素
我想替换列表中Python替换列表中也在另一个列表中的元素,并删除其他元素,python,list,enumerate,Python,List,Enumerate,我想替换列表中l1中也在l2中的元素,并删除不在l2中的元素。我不明白为什么下面的解决方案不起作用:它返回 [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] 使用集合存储l2元
l1
中也在l2
中的元素,并删除不在l2
中的元素。我不明白为什么下面的解决方案不起作用:它返回
[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]
使用集合存储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)
当您从正在迭代的列表中删除元素时,代码不起作用。当您dell[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中。使用集合存储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)
当您从正在迭代的列表中删除元素时,代码不起作用。当您dell[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中。Padraic的解决方案似乎是可行的,但为了理解您的代码出现问题的原因,您正在修改执行del l1[i]
步骤时迭代的列表。这将在循环的下一次迭代中更改所有索引,这可能不会达到您希望的效果。Padraic的解决方案似乎是可行的,但为了让您了解自己的问题的原因,在执行del l1[i]
步骤时,您正在修改正在迭代的列表。这将在循环的下一次迭代中更改所有索引,而下一次迭代可能无法实现您希望的功能。为什么它不起作用,因为您正在迭代并从同一列表中删除,l1
当wor='c'
这里i=2
时,考虑迭代
在本次迭代中,由于列表中不存在'c'
,因此您将从列表中删除,其中
l1=[33,33,'d']
,新列表
现在,
enumerate
函数已经结束,因为在i=2
之后没有更多的索引(因为列表的长度l1
由于删除而缩短)为什么它不起作用,因为您正在迭代并从同一个列表中删除,l1
当wor='c'
这里i=2
时,考虑迭代
在本次迭代中,由于列表中不存在'c'
,因此您将从列表中删除,其中
l1=[33,33,'d']
,新列表
现在,
enumerate
函数已经结束,因为在i=2
之后没有更多的索引(因为列表的长度l1
由于删除而缩短)添加一些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
的大小。这把一切都搞砸了。您不应该这样做。添加一些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
的大小。这把一切都搞砸了。您不应该这样做。在代码中,内置函数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
德尔
d
[33,33',,33]
['a','b','d','f']
在代码中,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
德尔
d
[33,33',,33]
['a','b','d','f']
那它怎么不工作了?这通常有助于尝试修复问题。如果它不起作用呢?我知道还有其他解决方案可行,但我想了解我的解决方案失败的原因我知道还有其他解决方案可行,但我想了解我的解决方案失败的原因