Python基础语法-内置数据结构之列表
列表的一些特点:
列表是最常用的线性数据结构
list是一系列元素的有序组合
list是可变的
列表的操作,
增:append、extend、insert
删:clear、pop、remove
改:reverse、sort
查:count、index
其他: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基础语法-内置数据结构之列表的更多相关文章
- Python内置数据结构之列表list
1. Python的数据类型简介 数据结构是以某种方式(如通过编号)组合起来的数据元素(如数.字符乃至其他数据结构)集合.在Python中,最基本的数据结构为序列(sequence). Python内 ...
- Python基础知识2-内置数据结构(下)
bytes.bytearray #思考下面例子: a = 1 b = a print(a == b)#True print(a is b)#True print(id(a) is id(b))#Fal ...
- Python基础知识2-内置数据结构(上)
分类 数值型 用浮点型的时候注意别和"=="一起使用. 数字的处理函数 注意round()函数的特殊:四舍六入五取偶 类型判断 列表list 列表list定义 初始化 列表索引访 ...
- [PY3]——内置数据结构(1)——列表及其常用操作
列表及其常用操作_xmind图 about列表 列表是一个序列,用于顺序存储数据 列表分为两种:ArrayList(用数组实现).LinkedList(用链表实现) 定义与初始化 #l ...
- Python基础语法04-数据结构
Python Number(数字) Python Number 数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间. Python 支持 ...
- 【python基础语法】字符串常用方法 、列表(第3天课堂笔记)
""" 字符串的方法 join 字符串拼接,将列表转换为字符串 find 查找元素位置 count 查找元素个数 replace 替换字符 split 字符串分割,将字符 ...
- Python的4个内置数据结构
Python提供了4个内置数据结构(内置指可以直接使用,无需先导入),可以保存任何对象集合,分别是列表.元组.字典和集合. 一.列表有序的可变对象集合. 1.列表的创建例子 list1 = []lis ...
- python面试总结4(算法与内置数据结构)
算法与内置数据结构 常用算法和数据结构 sorted dict/list/set/tuple 分析时间/空间复杂度 实现常见数据结构和算法 数据结构/算法 语言内置 内置库 线性结构 list(列表) ...
- Python第五章-内置数据结构01-字符串
Python 内置的数据结构 到目前为止,我们如果想保存一些数据,只能通过变量.但是如果遇到较多的数据要保存,这个时候时候用变量就变的不太现实. 我们需要能够保存大量数据的类似变量的东东,这种 ...
随机推荐
- Linux下使用rsync最快速删除海量文件的方法
常用的删除命令rm -fr * 就不好用了,因为要等待的时间太长.所以必须要采取一些非常手段.我们可以使用rsync来实现快速删除大量文件. 1.先安装rsync: yum install rsyn ...
- 论坛:Html代码生成器>>FCKeditor的使用
>>文件准备: >>例1: >>例2: >>例3:指定工具栏 添加 JS代码:
- 使用yarn 安装 Vue-DevTools
1. 从 github 下载 vuejs/vue-devtools https://github.com/vuejs/vue-devtools/archive/dev.zip 2.安装yarn 及 编 ...
- Java设计模式(8)——策略模式
一.策略模式定义 Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户 ...
- [C#]this.Invoke和this.BeginInvoke的区别
private void button1_Click(object sender, EventArgs e) { "; this.Invoke(new EventHandler(delega ...
- TCP的11种状态(转载)
TCP的11种状态 TCP三次握手建立连接 Tcp头部 六个标志位中,我们要用到三个: SYN:SYN= 1 表示这是一个连接请求或连接接受报文.在建立连接时用来进行同步序号(个人理解是,在建立连接的 ...
- java JNI 实现原理 (二) Linux 下如何 load JNILibrary
在博客java JNI (一)虚拟机中classloader的JNILibrary 中讨论了java中的Library 是由classloader 来load的,那我们来看看 classloader是 ...
- docker使用自定义镜像zabbix服务
一.关闭firewall,永久关闭,使用iptables防火墙 systemctl stop firewalld.service #停止firewall systemctl disable firew ...
- MongDB 配置成本地服务
一.配置mangodb. 首先现在下来直接安装就好了, 可视化工具可以后面再安装. 在自己安装的目录下面(这个随意做好能够放一块)建立一个data文件, 再在下面建立一个db文件 在cmd中进入到Mo ...
- SimpleDateFormat转换时间,12,24时间格式[转]
SimpleDateFormat转换时间,12,24时间格式 来自:http://blog.csdn.net/dongguang1082/article/details/4387165 在使用Simp ...