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