目錄
回复内容:
首頁 後端開發 Python教學 Python:为什么下面这段程序只删除1个0?

Python:为什么下面这段程序只删除1个0?

Jun 06, 2016 pm 04:23 PM
for if in remove

s=[0,0,5,3]
for x in s:
if x==0
s.remove(x)
结果为什么是[0,5,3]而不是[5,3]呢?

回复内容:

初始s[0] = 0, s[1] = 0, s[2] = 5, s[3] = 3

for执行第一次的时候,
x = s[0], 也就是 x = 0 然后将这个元素剔除,
s变成了[0, 5, 3], 也就是 s[0] = 0, s[1] = 5, s[2] = 3
for 执行第二次的时候,
x = s[1], 也就是 x = 5
因为x不是0,s不变

造成出现你这个结果的原因是列表s在运算过程中发生了变化.

合理的方法是将不是0的的元素重新放到一个新列表里面

<span class="k">print</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">s</span> <span class="k">if</span> <span class="n">x</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">]</span>
登入後複製
循环时尽量不要对list进行增,删操作 不要在循环中对数组进行变更操作,重要的事情我也不愿意说三次了。 洛克正解,不过手痒,也来分享一下我的看法吧
在for x in s:中的s是你迭代的列表, 而在迭代中, 你又使用了s.remove(x), 这一行代码修改了原来的列表s, 这样, 第二次执行"for x in s:"的时候, 这里的s和第一次执行的已经不是同一个列表了, 第一次s = [0, 0, 5, 3], 第二次s = [0, 5, 3], 但是, 他们使用的下标却又是同一组的下标, 即第一次下标为0, 第二次下标为1, 那么, 对应两次的列表s, 可知, 第一次s[0]为0, 第二次s[1]为2(对应第二个s)
所以, 这个很容易犯的错误, 就是因为迭代的列表发生了变化, 因此在python的迭代中, 一定不要修改列表(这里提一个你以后会犯的错误--列表的可变性和多引用, 导致修改其他列表时会改变原列表的问题)
那么, 除了洛克的列表推倒式(python中最好用, 最具特色, 最X炸天的技巧, 你必须要会哦), 其他解法:
1.)新建一个列表result = [], 保存符合条件的值result.append(x), 这样就没有修改原列表了
2.)使用a = s, 然后迭代a, for x in a:, 再使用s.remove(x)修改列表s, 那恭喜你, 你错了, 就是上面提到的多引用问题, 这个自己去好好看文档弄明白吧
最后如果看不太明白, 那分享一句话"书读百遍, 其义自见" @洛克 的解释很正确,但是方法可以改进。
这其实更适合通过 Python 的 filter 来解决:

<span class="c">#!/usr/bin/env python3</span>

<span class="k">def</span> <span class="nf">check_number</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">True</span>

<span class="n">s</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>

<span class="k">print</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="n">check_number</span><span class="p">,</span><span class="n">s</span><span class="p">))</span>
登入後複製
<span class="n">s</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
<span class="k">print</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">s</span><span class="p">))</span>
登入後複製
s = [i for i in s if i != 0] #手机码字,对付看吧
官方文档里有很好的例子,就在2.7版本的list章节。
循环时不实用原列单a[],而是使用a[:]
这个方法最简单,也不需要增加额外的代码。
另外,@黑溜儿 的问题很好,@洛克 的解释是对的。因为for循环的时候不是先获得列单长度,这样效率太低了。for是通过iter迭代器实现的,所以是动态的按下标迭代直到结尾。
Life is short, I use python. s已经不是原来的s,x确实原来的x 这样解释的话,循环体会执行四次,那第四次应该是数组越界了,为毛不报错?python是怎么个检查机制?
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1662
14
CakePHP 教程
1419
52
Laravel 教程
1311
25
PHP教程
1262
29
C# 教程
1235
24
解決kernel_security_check_failure藍色畫面的17種方法 解決kernel_security_check_failure藍色畫面的17種方法 Feb 12, 2024 pm 08:51 PM

Kernelsecuritycheckfailure(內核檢查失敗)就是一個比較常見的停止代碼類型,可藍屏錯誤出現不管是什麼原因都讓很多的有用戶們十分的苦惱,下面就讓本站來為用戶們來仔細的介紹一下17種解決方法吧。 kernel_security_check_failure藍色畫面的17種解決方法方法1:移除全部外部裝置當您使用的任何外部裝置與您的Windows版本不相容時,則可能會發生Kernelsecuritycheckfailure藍色畫面錯誤。為此,您需要在嘗試重新啟動電腦之前拔下全部外部裝置。

c語言if判斷多個條件怎麼寫 c語言if判斷多個條件怎麼寫 Mar 25, 2024 pm 03:24 PM

在C語言中,if語句通常用於基於單一條件執行特定程式碼區塊。但是,透過使用邏輯運算子(如 &amp;&amp;、|| 和 !),可以組合多個條件來進行判斷。包括使用邏輯與(&amp;&amp;)判斷多個條件、使用邏輯或(||)判斷至少一個條件、使用邏輯非(!)判斷單一條件的否定,以及嵌套if語句和使用括號明確優先權。

Vue 中使用 i18n 實作多語言切換的技巧 Vue 中使用 i18n 實作多語言切換的技巧 Jun 25, 2023 am 09:33 AM

隨著國際化的不斷發展,越來越多的網站和應用程式需要支援多語言切換功能。 Vue作為一款流行的前端框架,提供了一個名為i18n的插件,可以幫助我們實現多語言切換。本文將介紹Vue中使用i18n實作多語言切換的常見技巧。第一步:安裝i18n插件首先,我們需要使用npm或yarn安裝i18n插件。在命令列中輸入以下命令:npminst

out和in介面是什麼意思 out和in介面是什麼意思 Sep 28, 2021 pm 04:39 PM

out介面指的是輸出接口,in接口指的是輸入接口。 out介面一般代表著音源線路輸出接口,用來接負載,例音箱、耳機等;而in接口一般代表著音源線路輸入接口,用來接CD機、手機、MP3、電腦等。

Win10如何解除安裝Skype for Business?電腦上的skype怎麼徹底卸載方法 Win10如何解除安裝Skype for Business?電腦上的skype怎麼徹底卸載方法 Feb 13, 2024 pm 12:30 PM

Win10skype可以卸載嗎是許多用戶都想知道的問題,因為很多的用戶發現自己電腦上的預設程式上有這個應用,擔心刪除後會影響到系統的運行,下面就讓本站來為用戶們來仔細的介紹一下Win10如何卸載SkypeforBusiness吧。 Win10如何解除安裝SkypeforBusiness1、在電腦桌面點選Windows圖標,再點選設定圖示進入。 2、點選“應用”。 3、在搜尋框中輸入“Skype”,點選選取找到的結果。 4、點選「卸載」。 5

使用C#中的StringBuilder.Remove函數刪除字串中的指定部分 使用C#中的StringBuilder.Remove函數刪除字串中的指定部分 Nov 18, 2023 pm 01:28 PM

使用C#中的StringBuilder.Remove函數刪除字串中的指定部分在C#中,StringBuilder類別是一個可變的字串類型,它允許我們進行字串的修改和操作。而StringBuilder的Remove函數則提供了一種方便的方式來刪除字串中的指定部分。 StringBuilder.Remove函數的用法如下:publicStringBuilde

remove是什麼意思 remove是什麼意思 Aug 04, 2023 am 11:29 AM

remove是從資料結構中刪除一個元素、節點或字元的意思,具體的實作方式取決於所使用的程式語言和資料結構。無論是陣列、鍊錶或字串,remove操作都是程式設計師經常使用的操作之一,對於資料處理和演算法實作都非常重要。

JavaScript怎麼用for求n的階乘 JavaScript怎麼用for求n的階乘 Dec 08, 2021 pm 06:04 PM

用for求n階乘的方法:1.使用「for (var i=1;i<=n;i++){}」語句控制迴圈遍歷範圍為「1~n」;2、迴圈體中,使用「cj *=i」將1到n的數相乘,乘積賦值給變數cj;3、循環結束後,變數cj的值就n的階乘,輸出即可。

See all articles