1. 程式人生 > >從Python列表Remove操作的一個小問題說開去

從Python列表Remove操作的一個小問題說開去

  一.問題 :

       前兩天因工作需要,寫了一個Python小程式, 將某目錄下所有長度小於19的資料夾過濾掉,例如這個這個目錄:

      

        過濾完成後,只需要剩餘“2014_11_03-12-11-23”,“2014_11_04-13-11-26”這兩個資料夾即可。

       程式如下:

cwdlist = os.listdir("E:\Python")
for i in cwdlist:
    if len(i) <> 19:
         cwdlist.remove(i)
print cwdlist

      但返回結果卻事與願違,結果如下:

    

    為什麼“237”這個資料夾沒有被刪掉呢?

    在網上查找了一下,原來問題出在List操作的Remove方法上,Remove方法刪除第一次出現的該元素。

    也就是說它會按照元素進行查詢,遇到的第一個匹配的就將其刪除。更為重要的是:刪除的元素位置會被後面的元素填補上。

   也就是說,程式在刪除”236“後,這個位置被後面的”237“給補上了,這個時刻,

    列表的下標已經移到了最後一個元素”237“的位置,刪除”237“後,整個迴圈結束。

 二.解決方法:

        1.最簡單的方法,再複製一份列表來操作:

cwdlist = os.listdir("E:\Python")
cwdlist2 = list(cwdlist)
for i in cwdlist2:
    if len(i) <> 19:
         cwdlist.remove(i)
print cwdlist

       2.使用filter函式:

cwdlist = os.listdir("E:\Python")
def f(x): return len(x) == 19
print filter(f,cwdlist)

      3.再簡潔一點的寫法,使用lambda表示式:

cwdlist = os.listdir("E:\Python")
f=lambda x:len(x) == 19
print filter(f,cwdlist)
   或者
cwdlist = os.listdir("E:\Python")
print filter(lambda x:len(x) == 19,cwdlist)

      4.更為pythonic的方法,使用列表推導式:

cwdlist = os.listdir("E:\Python")
print [i for i in cwdlist if len(i) == 19]

   其實,這幾種方法的本質都是相同的,都是新建了一份列表。

相關推薦

Python列表Remove操作一個問題說

  一.問題 :        前兩天因工作需要,寫了一個Python小程式, 將某目錄下所有長度小於19的資料夾過濾掉,例如這個這個目錄:                過濾完成後,只需要剩餘“

python列表基礎操作

rem tle 我想 pop pri 技術分享 接下來 pan 列表 Python列表基本操作 記住一句話,叫做顧首不顧尾 首先我們來定義一個列表 name = ["jixuege","dajiba","boduoye","cangjinkong","youtianai"]

python練習冊 每天一個程序

註釋 and ati 註意 繪圖 windows 操作 jpeg odi PIL庫學習鏈接:http://blog.csdn.net/column/details/pythonpil.html?&page=1 1 #-*-coding:utf-8-*- 2 _

python練習冊 每天一個程序 第0002題

color == oot 關系型數據庫 auth creat user root mdb 1 #-*-coding:utf-8-*- 2 __author__ = ‘Deen‘ 3 ‘‘‘ 4 題目描述: 5 將 0001 題生成的 200 個激活碼

python練習冊 每天一個程序 第0010題

rgb pytho 進行 lur return n) dom randint window # -*-coding:utf-8-*- ‘‘‘ 題目描述: 使用 Python 生成類似於下圖中的字母驗證碼圖片 思路: 運用PIL庫加random 隨機字母進行生成

python 列表常用操作

返回 eve 區別 默認 () pytho extend inpu tro 1、 input 和 raw_input 的區別 raw_input() 直接讀取控制臺的輸入 input() 接收字符時必須加雙引號,否則會報錯 2、 Python 常見的列表操作 a).相加(相

python列表-簡單操作

列表 inf com 括號 整數 改變 切片 負數 ont 一、使用下標取列表中單個值(下標只能是整數,不能是浮點值) 1. (1) (2) (3) 2.負數下標 雖然下標從 0 開始並向上增長,但也可以用負整數作為下標。整數值?1 指的是 列表中的最後一個

Python文件操作自制練習

sarah 目標 port body pen out button one version for b in range(29): a = open(‘D:\\a\\‘ + str(b+1) + ‘.srt‘,‘r‘) #讀取文件 lines =

Python列表操作

列表列表:names=[‘xiaoming‘,‘xiaowang‘,‘xiaoli‘,‘xiaozhang‘]1.追加 names.append()2.刪除:pop,remove,delpop()remove()del 3.查看元素所在位置 index()4.統計元素的次數: count()5.反轉 rev

python列表基本操作(一)

一個 處理 move 長度 指定 排序 app 索引 處理方法 函數list 有些時候修改字符串不能像列表那樣,可以使用list來解決 list函數實際上是一個類,而不是函數。 somelist = list(‘hello‘) 字符串str1 = hello world,

python列表及其操作

# -*-coding:utf-8-*-# !/usr/bin/env python# Author:@vilicute# 列表初始化myList = [x for x in range(10) if not x % 2] # myList = [0, 2, 4, 6, 8]myList1 = ["aaa"

python 特別簡單的一個爬蟲(看著玩吧 )

  環境:python3.5    bs4   lxml這是需要安裝的   使用urllib模組來訪問頁面 bs4解析頁面,存到*.txt檔案中 #-*- coding:utf-8 -*- import urllib.reques

[python]列表操作

magicians = ['alice', 'david', 'carolina']for magician in magicians:print(magician) for magician in magicians:print(magician.title()+",that was a great tr

一次python程式的效能優化說

一門程式語言入門是容易的,至少大家都知道從hello world開始。但這次效能優化的經歷告訴我,“換語言”這件事是有門檻的。 這次效能優化是針對資料入庫流程中的一個環節(brief)做的。 我們常說解決問題重要,發現問題更重要。沒錯,這次發現問題就佔用了我

Python列表相關操作

1.建立列表    用方括號([])來表示,用逗號(,)分離元素    bicycles=['trek','cannodale','redline','specialized']2.訪問元素    bicycles[i]  -1表示末尾,-2表示次末尾...3.修改元素的值 

Python列表複製操作

引用是指儲存的值為物件的地址。在 Python 語言中,一個變數儲存的值除了基本型別儲存的是值外,其它都是引用,因此對於它們的使用就需要小心一些。下面舉個例子: 問題描述:已知一個列表,求生成一個新的列表,列表元素是原列表的複製 a=[1,2]b=a 這種做法其實

MySQL slave system lock延遲說

本文主要分析 sql thread中system lock出現的原因,但是筆者並明沒有系統的學習過master-slave的程式碼,這也是2018年的一個目標,2018年我都排滿了,悲劇。所以如果有錯誤請指出,也作為一個筆記用於後期學習。同時也給出筆者現在知道的幾種造成延遲的可能和延遲計算的方式

Swift 的面向協議程式設計說

寫在最前 文章標題談到了面向協議程式設計(下文簡稱 POP),是因為前幾天閱讀了一篇講 Swift 中 POP 的文章。本文會以此為出發點,聊聊相關的概念,比如介面、mixin、組合模式、多繼承等,同時也會藉助各種語言中的例子來闡述我的思想。 那些老生常談的概念,相信每位讀者都耳熟能詳了,我當然不會無聊到浪

合並兩個Map說 - foldLeft 和 foldRight 還有模式匹配

pan 開發者 簡化 ase map集合 兩個 簡單 tro 嘗試 開發中遇到需求:合並兩個Map集合對象(將兩個對應Key的值累加) 先說解決方案: ( map1 /: map2 ) { case (map, (k,v)) => map + ( k ->

零基礎python入門:一個程式開始

一般來說,學習程式設計,都喜歡從講語法開始,這是現行的大多數思路。但是程式語言很多,對應的語法大同小異,雖然在有些應用上有差別,在程式設計思想上有不同,但是最基礎的東西,永遠都是C裡面提到那些,判斷語句,迴圈語句,分支語句等等,拿變數定義來說: C語言: unsign