簡體   English   中英

從2個不同的列表中刪除類似的項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM