列表的一些特点:

  1. 列表是最常用的线性数据结构

  2. list是一系列元素的有序组合

  3. list是可变的

列表的操作,

  1. 增:append、extend、insert

  2. 删:clear、pop、remove

  3. 改:reverse、sort

  4. 查:count、index

  5. 其他:copy

>>> [a for a in dir(list) if not a.startswith('__')]
['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

定义与初始化列表

lst = list() # 使用list函数定义空列表
lst = [] # 使用中括号定义空列表
a = [1, 2, 3] # 使用中括号定义带初始值的列表
lst = list(range(1, 10)) # 使用list函数把可迭代对象转化为列表
a_ref = aa[2] = 100

列表的访问

可以通过下标访问列表中的元素,下标从0开始。当下标超出范围时,会抛出IndexError异常。下标可以是负数,负数下标从右开始,与正数下标刚好相反。负数下标从-1开始。不管是正数的下标还是负数的下标,只要超出范围,就会抛出异常。

lst = [1, 2, 3]
print(lst[0])
print(lst[2])
# print(lst[3])

列表常用操作

我们可以通过列表的下标(或索引)找到相应的元素,也可以通过列表元素找到其相应的索引。列表提供了index方法可以实现此需求,接下来我们就看一下如何使用列表的index方法。

lst = [1, 2, 3, 2, 5]help(lst.index)
 : Help on built-in function index:
 : 
 : index(...) method of builtins.list instance
 :     L.index(value, [start, [stop]]) -> integer -- return first index of value.
 :     Raises ValueError if the value is not present.
 :

index可以有其他两个参数,start,stop可以为负数,但是总是从左往右查找。

index方法根据值返回第一个索引。

a_copy = a[:]
a.append(300) # 在列表的末尾增加一个元素
a.insert(1, 50) # 在指定位置增加一个元素,如果索引超出范围,如果是正索
# 引,等效于append,如果索引为负数,等效于insert(0, object)。
a.pop() # 默认从列表最后移除一个元素,可以指定索引;索引不能超出范围
a.sort() # 排序方法a.reverse() # 反转方法
a.remove(value) # 移除列表中第一次出现的value,如果value不存在,则抛出ValueError异常
del a[1]

列表的count方法用于返回列表里出现元素的个数,如果没有就返回0。

lst = [1, 2, 3, 2, 3, 5]
print(lst.count(2))
print(lst.count(5))
# there was no element 0
print(lst.count(0))

count方法的原型:

def count(lst, value):
    c = 0
    for x in lst:
        if x == value:
            c += 1
    return c 

index和count的时间复杂度是O(n)线性复杂度(效率与数据规模成线性相关)。

由于列是可变的数据结构,因此可以对列表的元素可以进行修改。修改列表的元素直接使用下标操作取出元素并对其赋值即可。

lst = [1, 2, 3, 2, 4, 3, 5]
print(lst[2])
lst[2] = 5
print(lst[2])
# 对超出范围的索引修改元素,会抛出IndexError异常
# lst[7] = 7

增加列表元素,使用修改列表元素的方法不能增加列表元素。可以使用append方法来增加列表的元素,

lst = [1, 3, 5, 7]

lst.append(9)
print(lst)
lst.extend([1, 2, 3])
print(lst)
lst.extend(range(3))
print(lst) # remove
# 根据值来删除
# 从左到右删除第一次出现的元素
lst.remove(1)
print(lst)
# 删除一个不存在的值时,会抛出ValueError异常
# lst.remove(10)# pop
# 默认返回并删除最后一个元素
lst.pop()
print(lst)
# pop可以有参数
# 返回并删除索引所在位置的元素
lst.pop(1)
print(lst)
# 当pop不存在的索引时,抛出IndexError异常
# lst.pop(100)

运行结果为:

 : [1, 3, 5, 7, 9]
 : [1, 3, 5, 7, 9, 1, 2, 3]
 : [1, 3, 5, 7, 9, 1, 2, 3, 0, 1, 2]
 : [3, 5, 7, 9, 1, 2, 3, 0, 1, 2]
 : [3, 5, 7, 9, 1, 2, 3, 0, 1]
 : [3, 7, 9, 1, 2, 3, 0, 1] 

append与extend的对比:

  • append原地修改列表,返回None

  • extend原地修改,返回None

  • append操作单个元素

  • extend操作可迭代对象

pop与remove的对比:

  • pop是弹出索引对应的值

  • remove是删除最左边的第一次出现的值

  • pop针对的是索引

  • remove针对的是值

  • pop不传递index参数时,其时间复杂度为O(1)

  • pop传递index参数时,其时间复杂度为O(n)

insert可以在指定的位置处插入元素。当insert时,索引超出范围时:

  • 索引是负数,会在第0个元素前插入元素

  • 索引是正数,会在最后一个元素后插入元素

lst = [1, 3, 5, 7]
lst.insert(2, 'm')
print(lst)
lst.insert(10, 'e')
print(lst)
lst.insert(-10, 'a')
print(lst)

运行结果为:

: [1, 3, 'm', 5, 7]
: [1, 3, 'm', 5, 7, 'e']
: ['a', 1, 3, 'm', 5, 7, 'e']

insert操作的时间复杂度是O(n),append操作的时间复杂度是O(1)。

列表有copy的方法,

lst1 = [1, 3, 2, 5, 7]
lst2 = lst1 # 赋值操作,对可变对象是引用传递,对不可变对象是传值
print(lst2)
lst2.remove(2)
print(lst2)
print(lst1)
lst1 = [1, 3, 2, 5, 7]
lst2 = lst1.copy() # 影子拷贝
lst2.remove(2)
print(lst2)
print(lst1)

运行结果为:

: [1, 3, 2, 5, 7]
: [1, 3, 5, 7]
: [1, 3, 5, 7]
: [1, 3, 5, 7]
: [1, 3, 2, 5, 7]

赋值操作传递的是引用,也叫浅拷贝。

copy方法的原型:

def copy(lst):
    tmp = []
    for i in lst:
        tmp.append(i)
    return tmp

清除列表,

lst.clear() # 删除所有元素

求list的长度,

lst = []
print(len(lst))
lst = list(range(4))
print(len(lst))

列表反转,

列表排序,原地修改,返回None。默认是顺序排列,

lst.sort()
lst.sort(reverse=True)

去除列表中重复元素,

L1 = ['b', 'c', 'd', 'b', 'c', 'a', 'a']
L2 = []
[L2.append(i) for i in L1 if not i in L2]
print(L2)
: ['b', 'c', 'd', 'a']
iter = (x ** 2 for x in range(10) if x % 2 == 0)
iter
<generator object <genexpr> at 0x1056b42b0>>>>
for el in iter:
print(el)
0
4
16
36
64
###>>> print [(x, y) for x in (1, 2, 3, 4) for y in (10, 15, 3, 22) if x * y > 25]
[(2, 15), (2, 22), (3, 10), (3, 15), (3, 22), (4, 10), (4, 15), (4, 22)]

来看几个跟列表应用的例子,

# 求素数的列表使用法lst = []for n in range(2, 101):
    for x in lst:
        if n % x == 0:
            break
        else:
            lst.append(n)
            print(n)

一个例子

一个可以输出直方图的例子,代码如下:

(venv) [lavenliu@VM_171_247_centos mysite]$ cat hist.py 
# 从一个列表中创建一个直方图
values = [] # 首先创建一个空列表# 我们输入10个整数
print("Enter 10 integers:")
for i in range(10):
newValue = int(input("Enter integer %d: " % (i+1)))
values += [newValue]
# 创建直方图
print("\nCreating a histogram from values:")
print("%s %10s %10s" % ("Element", "Value", "Histogram"))
for i in range(len(values)):
print("%7d %10d  %s" % (i, values[i], "*" * values[i]))

运行结果为:

venv lavenliu@VM_171_247_centos mysite$ python hist.py 
Enter  integers:
Enter integer 1: 10
Enter integer 2: 8
Enter integer 3: 23
Enter integer 4: 15
Enter integer 5: 2
Enter integer 6: 5
Enter integer 7: 7
Enter integer 8: 9
Enter integer 9: 6
Enter integer 10: 4
Creating a histogram from values:
Element      Value  Histogram
                 **********
                  ********                 ***********************      
                 ***************      
                  **                  *****      
                  *******                  *********                  ******                  ***

Python基础语法-内置数据结构之列表的更多相关文章

  1. Python内置数据结构之列表list

    1. Python的数据类型简介 数据结构是以某种方式(如通过编号)组合起来的数据元素(如数.字符乃至其他数据结构)集合.在Python中,最基本的数据结构为序列(sequence). Python内 ...

  2. Python基础知识2-内置数据结构(下)

    bytes.bytearray #思考下面例子: a = 1 b = a print(a == b)#True print(a is b)#True print(id(a) is id(b))#Fal ...

  3. Python基础知识2-内置数据结构(上)

     分类 数值型 用浮点型的时候注意别和"=="一起使用. 数字的处理函数 注意round()函数的特殊:四舍六入五取偶 类型判断 列表list 列表list定义 初始化 列表索引访 ...

  4. [PY3]——内置数据结构(1)——列表及其常用操作

    列表及其常用操作_xmind图         about列表 列表是一个序列,用于顺序存储数据 列表分为两种:ArrayList(用数组实现).LinkedList(用链表实现) 定义与初始化 #l ...

  5. Python基础语法04-数据结构

    Python Number(数字) Python Number 数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间. Python 支持 ...

  6. 【python基础语法】字符串常用方法 、列表(第3天课堂笔记)

    """ 字符串的方法 join 字符串拼接,将列表转换为字符串 find 查找元素位置 count 查找元素个数 replace 替换字符 split 字符串分割,将字符 ...

  7. Python的4个内置数据结构

    Python提供了4个内置数据结构(内置指可以直接使用,无需先导入),可以保存任何对象集合,分别是列表.元组.字典和集合. 一.列表有序的可变对象集合. 1.列表的创建例子 list1 = []lis ...

  8. python面试总结4(算法与内置数据结构)

    算法与内置数据结构 常用算法和数据结构 sorted dict/list/set/tuple 分析时间/空间复杂度 实现常见数据结构和算法 数据结构/算法 语言内置 内置库 线性结构 list(列表) ...

  9. Python第五章-内置数据结构01-字符串

    Python 内置的数据结构 ​ 到目前为止,我们如果想保存一些数据,只能通过变量.但是如果遇到较多的数据要保存,这个时候时候用变量就变的不太现实. ​ 我们需要能够保存大量数据的类似变量的东东,这种 ...

随机推荐

  1. Linux下使用rsync最快速删除海量文件的方法

    常用的删除命令rm -fr * 就不好用了,因为要等待的时间太长.所以必须要采取一些非常手段.我们可以使用rsync来实现快速删除大量文件. 1.先安装rsync:  yum install rsyn ...

  2. 论坛:Html代码生成器>>FCKeditor的使用

    >>文件准备: >>例1: >>例2: >>例3:指定工具栏 添加 JS代码:

  3. 使用yarn 安装 Vue-DevTools

    1. 从 github 下载 vuejs/vue-devtools https://github.com/vuejs/vue-devtools/archive/dev.zip 2.安装yarn 及 编 ...

  4. Java设计模式(8)——策略模式

    一.策略模式定义 Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户 ...

  5. [C#]this.Invoke和this.BeginInvoke的区别

    private void button1_Click(object sender, EventArgs e) { "; this.Invoke(new EventHandler(delega ...

  6. TCP的11种状态(转载)

    TCP的11种状态 TCP三次握手建立连接 Tcp头部 六个标志位中,我们要用到三个: SYN:SYN= 1 表示这是一个连接请求或连接接受报文.在建立连接时用来进行同步序号(个人理解是,在建立连接的 ...

  7. java JNI 实现原理 (二) Linux 下如何 load JNILibrary

    在博客java JNI (一)虚拟机中classloader的JNILibrary 中讨论了java中的Library 是由classloader 来load的,那我们来看看 classloader是 ...

  8. docker使用自定义镜像zabbix服务

    一.关闭firewall,永久关闭,使用iptables防火墙 systemctl stop firewalld.service #停止firewall systemctl disable firew ...

  9. MongDB 配置成本地服务

    一.配置mangodb. 首先现在下来直接安装就好了, 可视化工具可以后面再安装. 在自己安装的目录下面(这个随意做好能够放一块)建立一个data文件, 再在下面建立一个db文件 在cmd中进入到Mo ...

  10. SimpleDateFormat转换时间,12,24时间格式[转]

    SimpleDateFormat转换时间,12,24时间格式 来自:http://blog.csdn.net/dongguang1082/article/details/4387165 在使用Simp ...