从2个不同的列表中删除类似的项目

时间:2019-09-09 18:47:27

标签: python list

还有更多的Python方式可以执行此代码吗?

sim_inits = [1,100, 12, 3520, 1250]
prod_inits = [2, 101, 13, 14, 3521, 1500]
for t in range(len(sim_inits)-1):
    sim_loop_done = False

    for s in sim_inits[:]:
        if sim_loop_done == True:
            continue

        prod_loop_done = False
        for p in prod_inits[:]:
            if prod_loop_done == True:
                continue

            if abs(s-p) < 3 :
                sim_inits.remove(s)
                prod_inits.remove(p)
                sim_loop_done = True
                prod_loop_done = True
print sim_inits
print prod_inits

输出:

[1250]
[14, 1500]

我试图遍历两个列表,当我找到匹配项(由小于3的差定义)时,我想移至下一个项目。我不希望从prod_inits中删除14个,因为sim_inits中的12个相对于prod_inits中的13个被删除了。

上面的代码有效,我只是想知道它是否可以更有效地完成。

1 个答案:

答案 0 :(得分:1)

您可以跳过其中一个循环,并且可以使用break而不是continue来早点退出另一个循环,而无需使用当前正在使用的繁琐标志。

列表切片非常昂贵-尤其是在prod_inits的情况下,您要复制整个列表以仅从其中删除一个元素。按索引进行迭代比较便宜,然后使用pop()而不是remove()删除该索引。同样,我们可以使用while循环来遍历列表s(而不是for循环),因为它可以让我们容纳正在执行删除操作的元素( s -= 1出于这个原因。

sim_inits = [1,100, 12, 3520, 1250]
prod_inits = [2, 101, 13, 14, 3521, 1500]
s = 0
while s < len(sim_inits):
    for p in range(len(prod_inits)):
        if abs(sim_inits[s]-prod_inits[p]) < 3:
            sim_inits.pop(s)
            prod_inits.pop(p)
            s -= 1
            break
    s += 1

print(sim_inits)
print(prod_inits)

在本地运行此代码后:

>>> print(sim_inits)
[1250]
>>> print(prod_inits)
[14, 1500]