还有更多的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个被删除了。
上面的代码有效,我只是想知道它是否可以更有效地完成。
答案 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]