Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python替换列表中也在另一个列表中的元素,并删除其他元素_Python_List_Enumerate - Fatal编程技术网

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']


那它怎么不工作了?这通常有助于尝试修复问题。如果它不起作用呢?我知道还有其他解决方案可行,但我想了解我的解决方案失败的原因我知道还有其他解决方案可行,但我想了解我的解决方案失败的原因