详解列表List

这里是列表对象方法的清单:

list.append(x)

  添加一个元素到列表的末尾。相当于a[len(a):] = [x]

list.extend(L)

  将给定列表L中的所有元素附加到原列表a的末尾。相当于a[len(a):] = L

list.insert(i, x)

  在给定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,所以 a.insert(0, x) 在列表的最前面插入,a.insert(len(a), x) 相当于a.append(x)

list.remove(x)

  删除列表中第一个值为 x 的元素。如果没有这样的元素将会报错。

list.pop([i])

  删除列表中给定位置的元素并返回它。如果未指定索引,a.pop() 删除并返回列表中的最后一个元素。(i 两边的方括号表示这个参数是可选的,而不是要你输入方括号。你会在 Python 参考库中经常看到这种表示法)。

list.clear()

  删除列表中所有的元素。相当于del a[:]

list.index(x)

  返回列表中第一个值为 x 的元素的索引。如果没有这样的元素将会报错。

list.count(x)

  返回列表中 x 出现的次数。

list.sort(cmp=None, key=None, reverse=False)

  原地排序列表中的元素。

list.reverse()

  原地反转列表中的元素。

list.copy()

  返回列表的一个浅拷贝,等同于a[:],注意是“浅拷贝”

将列表当作队列使用

  将列表当作队列使用,此时最先进入的元素第一个取出(FIFO,先进先出)。但是列表用作此目的效率不高,原因是在列表的末尾添加和弹出元素非常快,但是在列表的开头插入或弹出元素却很慢 (因为所有的其他元素必须向后移一位,顺序容器的通病)。

  如果要实现一个队列,可以使用 collections.deque,它设计的目的就是在两端都能够快速添加和弹出元素。例如:

 >>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry") # 加入一个试试
>>> queue.append("Graham") # 再加一个
>>> queue.popleft() # 删除队头
'Eric'
>>> queue.popleft() # 再删队头
'John'
>>> queue # 看看剩多少个(剩下后3个)
deque(['Michael', 'Terry', 'Graham'])

列表解析

  列表解析提供了一个生成列表的简洁方法。应用程序通常会从一个序列的每个元素的操作结果生成新的列表,或者生成满足特定条件的元素的子序列。

  例如,假设我们想要创建一个列表 s:

 s=[]
for x in range(10):
s.append(x**2)
print(x)
print(s)
---下面是打印---
9
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

  注意这个for循环中的被创建(或被重写)的名为x的变量在循环完毕后依然存在。使用如下方法,我们可以计算s的值而不会产生任何的副作用:

s = list(map(lambda x: x**2, range(10)))

  或者:

s = [x**2 for x in range(10)]

  列表解析由括号[]括起来,括号里面包含一个表达式,表达式后面跟着一个for语句,后面还可以接零个或更多的  for 或 if 语句。结果是一个新的列表,由表达式依据其后面的 for 和 if 字句上下文计算而来的结果构成。例如,下面的 listcomp 组合两个列表中不相等的元素:

 >>> [(x, y)   for x in [1,2,3] for y in [3,1,4]    if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

  这与如下代码是等效的:

 >>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

  有个更高级的应用,考虑下面由三个长度为 4 的列表组成的 3x4 矩阵:

 >>> matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]

  下面的列表解析可以将矩阵进行转置:

 >>> [ [row[i]  for row in matrix]  for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

  它是从最外层开始进行解析的,即上面代码的功能等同于如下代码:

 >>> transposed = []
>>> for i in range(4):
... transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

  有个方法可以从列表中按索引来删除元素: del 语句。这不同于有返回值的 pop() 方法。del 语句还可以用于从列表中删除切片或清除整个列表 (我们是将空列表赋值给切片)。例如:

 >>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]

  可以看到,del语句其实是直接对list对象进行操作的,而类似sorted等函数是直接返回一个对象拷贝的,所以并不会改变到原来的list。del 也可以用于删除整个变量:

>>> del a

  此后再引用名称 a 将会报错(直到有另一个值被赋给它)。

元组和序列

  元组tuple看起来类似于列表,它们经常用于不同的场景和不同的目的。元组是不可变的,而列表是 可变 的,它们的元素通常是通过迭代访问。

  元组在输出时总是有括号的,以便于正确表达嵌套结构。但在输入时括号可有可无,不过括号经常都是必须的(如果元组是一个子元素)。不能给元组中单独的一个元素赋值(即修改),但可以创建包含可变对象(如列表list)的元组,当然,list的内部是可以变的。

 >>> t = 12345, 54321, 'hello!'    #不带括号也能创建tuple
>>> t
(12345, 54321, 'hello!')
>>> empty = () #创建空tuple
>>> singleton = 'hello', # 包含单个元素的tuple,末尾的逗号
>>> len(empty)
0
>>> len(singleton)
1
>>> singleton
('hello',)

  语句t = 12345, 54321, 'hello!' 是一个元组封装的例子: 值12345, 54321 和 'hello!' 被一起放入一个元组。其逆操作也是可以的:

>>> x, y, z = t

  但是必须注意,左边的参数个数必须与右边tuple的大小对应,绝不允许多1个或者少1个。否则会产生歧义,比如仅有2个元素的tuple,x=t是代表什么呢?x指向t吗?还是说x取t的首元素?

集合

  Python 还包含了一个数据类型 集合set。集合中的元素不会重复没有顺序。集合对象还支持并集、 交集、 差和对称差等数学运算。

  花大括号{}或 set() 函数可以用于创建集合。注意: 若要创建一个空集必须使用set(),而不能用{},因为后者将创建一个空的字典dict。以下是一些普通的操作:

 >>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}    #创建一个set
>>> print(basket)
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket #测试元素是否存在
True
>>> a = set('abracadabra') #创建两个集合
>>> b = set('alacazam')
>>> a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b #集合作差
{'r', 'd', 'b'}
>>> a | b #求并集
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b #求交集
{'a', 'c'}
>>> a ^ b # 求对称差:将同时存在于a和b中的元素去除
{'r', 'd', 'b', 'm', 'z', 'l'}

  和 列表解析 类似,Python 也支持集合解析:

 >>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}

字典

  字典dict是无序的{键:值}对集合,要求是键key必须是唯一的(在同一个字典内)。一对大括号可以创建一个空的字典:{}。大括号中由逗号分隔的 ‘键:值’ 对将成为字典的初始值,打印字典时也是按照这种方式输出。

  与序列不同,序列由数字做索引,字典由key做索引。key可以是任意不可变类型,比如字符串和数字永远可以拿来做key。如果元组只包含字符串、 数字或元组,也可以用作key,而如果元组直接或间接地包含任何可变对象,不能用作key。不能用列表作为key,是因为列表可以通过索引、切片或者 append() 和extend() 等多种方法修改自身。

  dict的主要操作是依据键来存取值,也可以通过del删除 ‘键:值’ 对。如果用一个已经存在的key存储值,以前为该关键字分配的值就会被替代。从一个不存在的key中读取值将会导致错误,抛出异常。

  list( d.keys() )返回由dict中所有key组成的列表,其中key的顺序是随机的(如果你想它是有序的,只需使用sorted(d.keys())代替)。要检查某个键是否在字典中,可以使用 in 关键字。下面是一些常见的操作:

 >>> tel = {'jack': 4098, 'sape': 4139}    #创建一个dict
>>> tel['guido'] = 4127 #直接用[]进行索引出key对应的值
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape'] #删除一个元素对
>>> tel['irv'] = 4127 #新增一个元素对
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys()) #列出所有key
['irv', 'guido', 'jack']
>>> 'guido' in tel #判断key是否已经存在
True
>>> 'jack' not in tel
False

  dict的构造也可以有一些方便的操作,比如构造函数可以直接从‘键-值’ 对的序列中创建字典:

 >>> dict( [('sape', 4139), ('guido', 4127), ('jack', 4098)] )
{'sape': 4139, 'jack': 4098, 'guido': 4127}

  注意上面是用一个序列来初始化dict的,list或者tuple皆可,但是其每个元素必须是一个包含'key,value'的序列,同样也可以是tuple或者list。此外,字典解析可以用于从任意键和值表达式创建字典:

 >>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

  如果键都是简单的字符串,有时通过关键字参数指定 键-值 对更为方便,但是也仅仅适用于此:

 >>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}

python内置的数据结构的更多相关文章

  1. 【转】python 内置函数总结(大部分)

    [转]python 内置函数总结(大部分) python 内置函数大讲堂 python全栈开发,内置函数 1. 内置函数 python的内置函数截止到python版本3.6.2,现在python一共为 ...

  2. python内置函数,匿名函数

    一.匿名函数 匿名函数:为了解决那些功能很简单的需求而设计的一句话函数 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n ...

  3. Python内置常量

    引言 Python内置的常量不多,只有6个,分别是True.False.None.NotImplemented.Ellipsis.__debug__. 一. True 1. True是bool类型用来 ...

  4. python 内置函数总结(大部分)

    python 内置函数大讲堂 python全栈开发,内置函数 1. 内置函数 python的内置函数截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是pytho ...

  5. 熟记这些python内置函数,你离大佬就不远了

    python内置了很多函数,方便我们在写程序的时候调用,在ython 2.7 的所有内置函数共有80个.熟练记住和使用这些内置函数,将大大提高写Python代码的速度和代码的优雅程度. 以下代码示例用 ...

  6. python内置函数

    python内置函数 官方文档:点击 在这里我只列举一些常见的内置函数用法 1.abs()[求数字的绝对值] >>> abs(-13) 13 2.all() 判断所有集合元素都为真的 ...

  7. python 内置函数和函数装饰器

    python内置函数 1.数学相关 abs(x) 取x绝对值 divmode(x,y) 取x除以y的商和余数,常用做分页,返回商和余数组成一个元组 pow(x,y[,z]) 取x的y次方 ,等同于x ...

  8. Python内置的字符串处理函数整理

    Python内置的字符串处理函数整理 作者: 字体:[增加 减小] 类型:转载 时间:2013-01-29我要评论 Python内置的字符串处理函数整理,收集常用的Python 内置的各种字符串处理 ...

  9. Python基础篇【第2篇】: Python内置函数(一)

    Python内置函数 lambda lambda表达式相当于函数体为单个return语句的普通函数的匿名函数.请注意,lambda语法并没有使用return关键字.开发者可以在任何可以使用函数引用的位 ...

随机推荐

  1. ZZC语言代码风格

    程序员之路--关于代码风格 优秀的代码风格如同一身得体的打扮,能够给人以良好的印象.初学程序设计,首先必须建立良好的编程习惯,这其中就包括代码风格.本文就代码风格中的几个重点问题进行了讨论,并在文后给 ...

  2. Linux下smba服务端的搭建和客户端的使用

    解决了 windows下用root登录linuxsamba后有部分目录访问无权限的问题.应该是SELinux 设置问题. 对selinux进行修改,一般为终止这项服务,操作如下: 查看SELinux状 ...

  3. CentOS 6.2下SVN服务器的安装与配置

    安装了一下SVN服务器,本文没有与Apache整合,过程如下: 一,下载相关软件: [root@youxia201 test]# wget http://subversion.tigris.org/d ...

  4. discuz判断用户登录

        在include/common.inc.php 文件.程序开始先判断是否有cookie存到了sid值,然后解密cookie['auth']这个用户登录状态加密字符串,如果解密出来有uid值表示 ...

  5. [CSS]三层嵌套的滑动门

    原理: 最外层放水平平铺的背景,第二层放左边,第三层放右边,注意这个做法背景图不能透明 结构: <div class="module-title"> <span ...

  6. 数据结构-Hash表

    实现: #ifndef SEPARATE_CHAINING_H #define SEPARATE_CHAINING_H #include <vector> #include <lis ...

  7. POJ 2296 二分+2-sat

    题目大意: 给定n个点,给每个点都安排一个相同的正方形,使这个点落在正方形的下底边的中间或者上底边的中间,并让这n个正方形不出现相互覆盖,可以共享同一条边,求 这个正方形最大的边长 这里明显看出n个点 ...

  8. [转]powerDesigner生成excel版本的数据库文件

    powerDesigner生成excel版本的数据库文件 出处:http://ray-allen.iteye.com/blog/1893347 脚本 excel  今天收到一个需求,要把数据库设计给一 ...

  9. HDU 4548

    题意: 给你一个区间,问你这个区间中的数既是素数又是美素数的数有多少个?美素数:首先这个数本身必须是素数并且它的各位数字的和也是素数; 如29,本身是素数, 而且2+9 = 11也是素数, 所以它是美 ...

  10. java基础之 异常

    Throwable是所有Java程序中错误处理的父类,有两种资类:Error和Exception. Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继 ...