簡體   English   中英

迭代時如何從列表中刪除元素?

[英]How to remove element from a list while iterating?

my_list = ['aa', 'aab', 'aaa', 'deff', 'abcde']

my_list 按元素長度排序。 我想做的事:

對於從左到右的每個元素,如果一個元素是另一個元素的一部分,則刪除較短的元素。 例如,由於 'aa' 是 'aab' 的一部分,我想刪除 'aa'。

length = len(my_list)
for i in range(0, length):
    v = my_list[i]
    j = i+1
    if j<length:
        if v in my_list[j]:
            my_list.pop(i)

此循環更改了原始列表,因此它中斷了。

這個版本似乎工作:

length = len(my_list)
new_list = my_list.copy()
for i in range(0, length):
    v = my_list[i]
    for j in range(i+1, length):
        if v in my_list[j]:
            new_list.pop(i)

您不應該修改您正在迭代的列表,您在此處實際上是這樣做的。 因此,您將創建一個新列表my_list_out = my_list[:]並修改它而不是在循環內。

關於您的代碼的其他一些不請自來的建議(除了建議任何聰明的單行代碼來解決這個問題):

length = len(my_list)
for i in range(0, length):
    v = my_list[i]
    j = i+1
    if j<length:
        if v in my_list[j]:
            my_list.pop(i)
  • for語句上的縮進需要修復

  • 使用enumerate function,您可以替換這種構造:

        for i in range(0, length):
            v = my_list[i]

有了這個:

        for i, v in enumerate(my_list[:length]):

或者在這種情況下,因為您設置了length = len(my_list) ,所以:

        for i, v in enumerate(my_list):`
  • 你在最后一次迭代中並沒有真正做任何事情,所以你不妨循環到前一個迭代然后避免if j<length測試

將這些放在一起,再加上(如下面的評論中所討論的)要求是彈出字符串是任何后續元素的一部分的元素,而不僅僅是緊鄰的元素,給出了:

my_list = ['aa', 'aab', 'aaa', 'deff', 'abcde']

my_list_out = my_list[:]
length = len(my_list)
for i, v in enumerate(my_list[ : length-1]):
    for v2 in my_list[i+1 :]:
        if v in v2:
            my_list_out.pop(i)
            break
my_list = my_list_out

print(my_list)

在這種情況下,在內部循環中不需要索引,因此循環只是在值之上( for v2 in... )。

運行這個給出:

$ python3 test.py
['aab', 'aaa', 'deff', 'abcde']

當您以相反的順序處理輸入列表並將結果反轉時會更容易。

使用以下代碼(打印輸出僅用於演示):

out = []
for it in reversed(my_list):
    if any(it in s for s in out):
        print(f'{it} - drop')
    else:
        out.append(it)
        print(f'{it} - keep')
out = list(reversed(out))
print(out)
my_list = ['aa', 'aab', 'aaa', 'deff', 'abcde']
list_str = str(my_list) # "['aa', 'aab', 'aaa', 'deff', 'abcde']"
new_list = my_list.copy()
next_ptr = 1  # for the beginning "["
for i in range(len(my_list)-1):
    next_ptr += 4 + len(my_list[i]) # 4 is for two single quotation('), one comma(,) and one space
    if my_list[i] in list_str[next_ptr:]:
        new_list.pop(i)
my_list = new_list

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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