反向循环遍历列表,边走边删除元素

时间:2021-03-16 09:22:18

标签: python-3.x list compare

我正在比较两个列表。 ABA,你好吗?我没事,B。如果A 项出现在列表B 中,则应将其从列表A 中删除。比较是 RGB 颜色列表。

只是它超出了范围,我不知道为什么,因为我正在反向循环列表。

data = [
[224,  96,  96],
[128, 32, 192], # match
[192, 32, 160], # match
]

myColours = [
[207, 30, 30],
[207,159, 30],
[ 79,207, 30],
[ 32, 64, 192],
[128, 32, 192],
[192, 32, 160],
]

for x in list(range(len(data)-1, -1, -1)):
  for y in range(0, len(myColours)):
    if myColours[y] == data[x]:
      print (data[x])
      data.remove(data[x]) # list index out of range

列表数据应该以

结尾
data = [
[224,  96,  96]
]

数据将由代码生成,myColours 由手工生成。它们的顺序并不重要,重要的是值。

3 个答案:

答案 0 :(得分:1)

代码可以是:

data = [
[224,  96,  96],
[128, 32, 192], 
[192, 32, 160], 
]

myColours = [
[207, 30, 30],
[207,159, 30],
[ 79,207, 30],
[ 32, 64, 192],
[128, 32, 192],
[192, 32, 160],
]

l=len(myColours)

for i in range(0,l):
    for x in data:
        if x in myColours:
            data.remove(x)
            
print(data)

运行我写的代码后,输出如下:

[[224, 96, 96]]

答案 1 :(得分:1)

使用列表理解:

data = [
[224,  96,  96],
[128, 32, 192], # match
[192, 32, 160], # match
]

myColours = [
[207, 30, 30],
[207,159, 30],
[ 79,207, 30],
[ 32, 64, 192],
[128, 32, 192],
[192, 32, 160],
]

data = [item for item in data if item not in myColours]

#to iterate backwards:
#data = [item for item in reversed(data) if item not in myColours]

答案 2 :(得分:1)

有两种方法可以解决您的问题:

首先:

data = [
[224, 96, 96],
[128, 32, 192],
[192, 32, 160],
]

myColours = [
[207, 30, 30],
[207, 159, 30],
[79, 207, 30],
[32, 64, 192],
[128, 32, 192],
[192, 32, 160],
]

a = 0
x = len(data)
while a < len(data):
    for i in myColours:
        if data[a] == i:
            del(data[a])
            a = 0
            break
    if a < len(data):
        a += 1
 print(data)

第二个:

data = [
[224, 96, 96],
[128, 32, 192],
[192, 32, 160],
]

myColours = [
[207, 30, 30],
[207, 159, 30],
[79, 207, 30],
[32, 64, 192],
[128, 32, 192],
[192, 32, 160],
]

data2 = data.copy()

x = 0
for i in range(len(data)):
    for i2 in myColours:
        if data[i] == i2:
            del(data2[i-x])
            x += 1
            break
print(data2)

还有一种方法可以使用分支,但不是完美的方法。