最近剛學習python,問題1:書上有道習題是讓我把 「串列」當中的3個元素刪掉。
當時我認為這種逐個洗掉的方法,非常蠢,想到應該可以有更快捷、更萬全靈活的方法。就把這個問題的種子埋下來了。
當我學到if的時候發現可以讓代碼自己判斷了,就想能不能快速洗掉,但后來發現 if else elif 都是單次判斷,沒有回圈迭代,就沒辦法了。
再到學習for in回圈的時候,我覺得這個謎題應該解開了。但發現用,remove() 和 pop()配合for in回圈,是會出現迭代器“錯位”的。于是轉頭去嘗試用 del 陳述句。{問題2:書上面至今沒說del和remove()有什么區別,應該是叫「陳述句」和函式吧?}
然后意識到根本不關 函式或者陳述句的問題,而是for in的指標會因為洗掉元素,而自動跳開一個元素,導致回圈比預期少了1次。那么想問,有沒有辦法通過我已有知識對同一個串列進行連續洗掉元素作業,直到串列沒有元素呢?
恍然大悟的錯誤


uj5u.com熱心網友回復:
在這先謝謝各位大佬的解答uj5u.com熱心網友回復:
>>> ls=[i for i in range(10)]
>>> ls
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for e in ls.copy():
... print(e)
... if e%3==0:
... ls.remove(e)
...
0
1
2
3
4
5
6
7
8
9
>>> ls
[1, 2, 4, 5, 7, 8]
uj5u.com熱心網友回復:
1,不可以用del一下子全部刪掉么?2,像你寫的那個回圈代碼,應該可以直接用del dinner,就全部刪掉啦,無需進行回圈處理。
3,del a[1], 洗掉串列中的第二個元素。
a.remove('bbb'),洗掉串列中'bbb'的選項。
前者通過序列號洗掉資料,后者通過內容洗掉資料。
uj5u.com熱心網友回復:
這個簡直是天秀,完全看不懂哈哈
uj5u.com熱心網友回復:
恩恩,remove和del的用法我懂,我只是不懂他們兩叫什么語法……
del dinner 顯示的是,dinner沒有被定義啊,是把當成變數而不是串列了吧?

感謝大佬百忙之中,回復我的問題。
uj5u.com熱心網友回復:
my point is:using list.copy() method
make sure
the whole for recycle
uj5u.com熱心網友回復:
# 測驗for回圈里面直接洗掉序列
f=['a','d','e']
tip = 1
for x in f:
del f[0]
print(str(tip)+"次洗掉")
print(x)
print(f)
tip=tip+1
print(tip)
print(f)
"""
輸出結果:
1次洗掉
a
['d', 'e']
2次洗掉
e
['e']
3
['e']
這是我剛剛在自己的電腦進行的一些操作,說下自己的觀點:
我覺得這個回圈寫成這樣根本就不規范,因為你的代碼是想在f這個序列里進行回圈,
可是你卻對f這個序列進行洗掉操作。
我自己在使用回圈的時候,比如for x in f
那么,我在回圈后面所做的操作都是針對這個x的,而不會去對f進行操作。
因為但凡你對f里的元素進行操作,那么因為f元素的增加減少等因素,會導致你的回圈出現難以理解的地方。
這就好像你去飯店吃飯,卻把人家飯館砸了一樣,結果害得你自己吃飯都沒辦法吃好。
至于你那里為什么會報錯,也是因為你在回圈里使用del ,
for x in f:
del f
當回圈完第一次之后,f就被整個洗掉了,所以當回圈進行到第二次之后,就找不到這個f了。
如果要進行洗掉整個f的操作,不需要寫回圈,直接寫del f 即可。
PS:
我也是剛剛學習這個的新手,一起加油吧.
"""
uj5u.com熱心網友回復:
、明白了~get到一個新思路。
uj5u.com熱心網友回復:
很用心啊,我的理解是和你一樣的
uj5u.com熱心網友回復:
你應該多看看Python知識,不要什么問題都要問,這樣并不適合學習uj5u.com熱心網友回復:
題主可能學過其他的語言,所以在這段代碼中,把for的結構用于回圈次數的計數,在python中for結構是用于生成迭代器的,讓你能夠逐個使用迭代的值;
在你的代碼中for...in.... 這行代碼生成迭代器(因為dinner是可迭代物件),但在for回圈的從屬代碼塊中(就是下面縮進的),并沒有利用迭代物件,代碼邏輯是很混亂的,在python中,for回圈一般不用來計數
題主用for回圈的用意是"用迭代次數去匹配洗掉次數",正好可以洗掉完所有元素.
那么正確的邏輯應該是串列有多長(即有幾個元素),那么就洗掉幾次:
for i in range(len(dinner)):
del dinner[0]
最后dinner = []
注意,dinner仍然存在,只是元素為空(布爾運算式為False)
至于
del dinner
則是洗掉了dinner這個串列,dinner就不存在了
再看一下你所要完成的目的,"逐個洗掉串列的元素"換句話說就是"當串列不為空時,一直執行洗掉操作":
可以用python提供的另一個回圈結構while:
它在邏輯上表示為: 只要條件滿足(true),就一直回圈
while dinner: #在dinner有元素時,運算式一直為True,直到dinner沒有元素(Fales),不在執行回圈
del dinner[0] #從dinner頭部開始洗掉元素
迭代器之類的深入內容不屬于基礎內容,建議在學習完基本語言框架之后再學習
uj5u.com熱心網友回復:
T = [1, 2, 3, 4, 5]
for index, item in enumerate(T):
print('剩余陣列:{}'.format(T), '即將洗掉前面陣列中下標為{}的數,即{}'.format(index, T[index]), sep='\n')
T.remove(item)
#輸出
# 剩余陣列:[1, 2, 3, 4, 5]
# 即將洗掉前面陣列中下標為0的數,即1
# 剩余陣列:[2, 3, 4, 5]
# 即將洗掉前面陣列中下標為1的數,即3
# 剩余陣列:[2, 4, 5]
# 即將洗掉前面陣列中下標為2的數,即5
這個你看懂了就明白為什么會洗掉不完有剩余了
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/268106.html
上一篇:irvine32 鏈接庫問題
下一篇:計算機網路"速率"問題
