Python中列表的陷阱

作为python的初学者,在做决策树算法的程序时一个有关列表删除的问题困扰了一天。今天在博客里写出来,希望大家也可以避免如此的问题。

下面是代码纲要:

def read_txt(filename):#定义了一个读txt文件的函数,这个函数的作用是将一个txt的表格转化成一个python列表。

它是一个嵌套的列表,下面随便粘几行:

[‘54‘, ‘ ?‘, ‘ 180211‘, ‘ Some-college‘, ‘ 10‘, ‘ Married-civ-spouse‘, ‘ ?‘, ‘ Husband‘, ‘ Asian-Pac-Islander‘, ‘ Male‘, ‘ 0‘, ‘ 0‘, ‘ 60‘, ‘ South‘, ‘ >50K‘]

[‘31‘, ‘ Private‘, ‘ 84154‘, ‘ Some-college‘, ‘ 10‘, ‘ Married-civ-spouse‘, ‘ Sales‘, ‘ Husband‘, ‘ White‘, ‘ Male‘, ‘ 0‘, ‘ 0‘, ‘ 38‘, ‘ ?‘, ‘ >50K‘]

这个列表中会有很多行用‘ ?‘标记的字段,会影响我后续的处理。所以我采用一种办法,那就是对于包含‘?’的行全部删除,接下来的子函数就是这个作用。

def computeNa(items):
#detect missing value in list and handle it
for item in items:
if item.count(‘ ?‘) > 0:
items.remove(item)
return items

短短的几行代码,意思很清楚。接下来:

fileName = "C:\data.txt"

data_list = read_txt(filename)

data_filtered = computeNa(data_list)

在代码的测试阶段我发现

print len(data_list) #得到结果32561

print len(data_filtered)  #得到结果30310

我以为这个函数很好的处理了missing value,后续处理才发现原来data_filtered还有‘?’存在。你知道这是为什么吗?

接下来我开始处理这个bug:

我又加了一句data_filtered2 = computeNa(data_filtered) 然后print len(data_filtered2) #得到结果30162。奇怪的是这次data_list中的missing value全没了,所以我得到结论,要想过滤掉data_list中的missing value必须过滤两次。好像可以说的通一样,但是我知道这是一个bug。后来我想了很多办法都没有搞定这个问题,我甚至怀疑这是python的一个巨大漏洞。就这样纠结了一天,就在刚刚我看python提供的documentation发现了这样一句话“If you need to modify the sequence you are iterating over while inside the loop (for example to duplicate selected items), it is recommended that you first make a copy. Iterating over a sequence does not implicitly make a copy. The slice notation makes this especially convenient:”(https://docs.python.org/2/tutorial/controlflow.html#for-statements)。

意思是说,如果想在一个循环中改变一个列表中的内容你最好为这个列表做一个复制,所以只需要把“for item in items:”改为“for
item in items[:]:”,这样这个bug就解决了。希望大家在以后用列表的时候注意这点。

时间: 2024-11-10 00:23:57

Python中列表的陷阱的相关文章

python中列表的应用

本文主要介绍了:python中列表的主要应用和一些列表自带的一些函数 代码: #!/usr/bin/env python# author by lh# -*- coding:utf-8 -*- name_list=['al','ed','fg']print name_list #打印列表 print name_list[0] #索引 print name_list[0:2] #切片 for i in name_list: #for循环打印 print i name_list.append('ed

Python中列表的一些方法

Python中列表的常用内置方法 1.向列表的后面追加  list.append() 2. 清空列表 list.clear() 3. 列表复制 list.copy( )  深复制 list.deepcopy() 4. 扩展原列表 list.extend() 5. 获取当前值索引的位置 list.index()  左边的优先找到 6.在列表的指定位置插入指定的元素 list.insert(index,value) 7.删除列表的某个下标值 list.pop()  --通过下标删除 8.删除列表中的

python中列表(list)函数及使用

序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列都可以进行的操作包括索引,切片,加,乘,检查成员. 此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法. 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可

Python中列表list常见操作

主要涉及知识点 列表是我们python里面最常见的数据类型,我们主要有以下的操作. 1.索引 2.切片 3.追加 4.删除 5.长度 6.循环 (也称遍历) 7.包含 8.嵌套 例如定义列表: List2=['openstack','python','linux',"docker","zabbix","nginx","linux","linux","123","ww33##&q

python中列表 元组 字典 集合的区别

列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. (1)列表 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单.比如,统计过去一周我们买过的东西,把这些东西列出来,就是清单.由于我们买一种东西可能不止一次,所以清单中是允许有重复项的.如果我们扩大清单的范围,统计我们过去一周所有的花费情况,那么这也是一个清单,但这个清单里会有类别不同的项,比如我们买东西是一种花费,交水电费也是一种花费,这些项的类型是可以使不同的.pyt

python中列表操作

列表 目录: 1:序列操作    ------索引    ------分片    ------步长    ------序列运算    ------成员资格检验    ------内建函数-len-max-min 2:列表操作    ------list函数        ------改变列表    ------删除元素    ------分片赋值 3:列表方法    ------append 在列表末尾添加新的元素    ------count 统计某个元素在列表中出现的次数    ------

python中列表的增删查改

本文将学习python中对列表中的元素进行增删查改操作以l为例:l=['hello','tomorrow','!']1.增加:(1)在列表末尾增添元素:列表名.append('element') l.append('hello') print(l) 输出:(2)在列表任意位置插入元素:列表名.insert(索引,'element')l.insert(1,"luu's")print(l)输出: 2.删除(1)del 列表名[序号] del l[1] print(l) (2)列表名.pop

python中列表,字典等必须要注意的事项

1.python中的列表不能够遍历删除 1 #python列表我们不能够遍历删除 2 li = [1, 2, 3, 4, 5, 6] 3 for i in range(len(li)): 4 print(i) 5 del li[i] 6 print(li) 7 # 输出结果: 8 # Traceback (most recent call last): 9 # 0 10 # [2, 3, 4, 5, 6] 11 # File "C:/Users/XZB/PycharmProjects/s1/da

python中列表、元组、字典简单介绍

简单说明一下,我之前接触过C++语言,Java语言,然后为了写自动化测试脚本又接触了python语言.虽然我不是编程大牛(开发人员).但是从我接触的这几个语言来说,如果你想学编程,以前又没有学习过,那么我真的挺建议大家去学习python的.我也理解了为什么会有一句话"人生苦短,我要用python" 首先说下这几个的定义: 1.列表(list):专门用于存储一串信息,列表用中括号[]定义,数据之间使用逗号,分隔 如图: 2.元组(Tuple):与列表类似,不同之处在于元组的元素不能修改,