[英]Removing similar items from 2 different lists
有沒有更多的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的差定義)時,我想移至下一個項目。 我不希望14取出prod_inits
,因為從12 sim_inits
是對在13取出prod_inits
。
上面的代碼有效,我只是想知道它是否可以更有效地完成。
您可以跳過其中一個循環,並且可以使用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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.