Python 从两个不同的列表中删除类似项
有没有一种更像python的方式来执行这段代码Python 从两个不同的列表中删除类似项,python,list,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
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
我试图在这两个列表上循环,当我找到一个匹配项(由小于3的差值定义)时,我想转到下一项。我不希望从prod_inits
中删除14,因为从sim_inits
中删除的12与prod_inits
中的13相对应
上面的代码很有效,我只是想知道是否可以更有效地完成。您可以跳过其中一个循环,并且可以使用
中断
而不是继续
来尽早退出另一个循环,而不必使用当前使用的繁琐标志
列表切片非常昂贵-尤其是在prod_inits
的情况下,您要复制整个列表,只需从其中删除一个元素。按索引进行迭代,然后使用pop()
而不是remove()
来删除该索引更便宜。类似地,我们可以使用while
循环在列表s
中计数(而不是for
循环),因为它允许我们通过这样做来适应我们正在移除的元素(因此我们做s-=1
)
这正是我想要的,更快、更干净、更直接——谢谢
[1250]
[14, 1500]
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]