一、元组

1.1 

元组(tuple)是一种一维的、定长的、不可变的python对象序列。最简单的创建方式是一组以逗号隔开的值:

数据结构和序列

在更复杂的表达式中定义元组时,常常需要用圆括号讲值围起来,比如如下例子创建了一个由元组组成的元组:

数据结构和序列

通过调用tuple,任何序列或迭代器都可以被转换为元组:

数据结构和序列

跟大部分其他序列类型一样,元组的元素也可以通过方括号[ ]进行访问,python中的序列也是从0开始索引的。

数据结构和序列

虽然存储在元组中的对象本身可能是可变的,但一旦创建完毕,存放在各个插槽中的对象就不能再被改变了。

数据结构和序列

但是,可以添加元素:

数据结构和序列

元组可以通过加号(+)运算符连接起来以产生更长的元组:

数据结构和序列

1.2 元组拆包

如果对元组型变量进行赋值,python就会尝试将等号右侧的值进行拆包(unpacking)

数据结构和序列

即使是嵌套元组也能被拆包:

数据结构和序列

利用该功能可以轻松第交换变量名。而这个任务在其他语言中可能是这样:

tmp=a

a=b

b=tmp

b,a=a,b

变量拆包功能常用于对由元组或列表组成的序列进行迭代:

seq=[(1,2,3),(4,5,6),(7,8,9)]
for a,b,c in seq:

    pass

另一个常见的方法是处理从函数中返回的多个值。

1.3元组方法;

由于元组的大小和内存不能被修改,所以其实例方法很少,最有用的死count(对列表也是如此),它用于计算指定值的出现次数:

数据结构和序列


二、列表(list)

2.1

与元组相比,列表是变长的,而且内容可以修改,可以通过方括号[ ],或list函数进行定义.

数据结构和序列

列表和元组在语义上死差不多的,都是一维的=序列,因此他们在许多函数中是可以互换的。

2.2添加和移除元素

通过append方法,可以将元素添加到列表的末尾:

数据结构和序列

利用insert可以将元素插入到列表的指定位置:

数据结构和序列

insert的逆运算是pop,它用于移除并返回指定索引处的元素:

数据结构和序列

remove用于按值删除元素,它找到第一个符合要求的值然后将其从列表中删除:

数据结构和序列

通过in关键字,可以判断列表中是否含有某个值

数据结构和序列

判断列表是否含有某个值的操作比字典和集合慢得多。

2.3合并列表

跟元组一样,用加号(+),将两个列表加起来即可实现合并:
数据结构和序列
对于一个已定义的列表,可以用extend方法一次性添加多个元素:
数据结构和序列

相对于合并列表,用extend将元素附加到现有列表是一种快捷并且节约资源的方法。


2.4 排序

调用列表的sort方法可以实现对列表就地排序(无需创建新对象):
数据结构和序列
次要排序键,是一个能够产生可用于排序的值的函数。例如:可以通过长度对一组字符串进行排序:

2.5 二分搜索及维护有序列表
内置的bisect模块实现了二分查找以及对有序列表的插入操作。bisect.bisect可以找出新元素应该被插入到那个位置才迸保持愿列表的有序性,而bisect.insort则确实地将新元素插入到那个位置上去。

数据结构和序列
bisect函数不会判断原列表是否是有序的,所以将他们用于无序列表虽然不会报错,但是可能会产生不正确的结果。

2.6 切片
通过切片标记法,可以选取序列类型(数组,元组,NumPy数组等)的子集,其基本形式由索引运算符:[ ]和传入其中的start:stop组成:

数据结构和序列
切片还可以被赋值为一段序列:

数据结构和序列
将元素7,改为了6,3

由于start索引处的元素是被包括在内的,而stop处的元素是为被包括在内的,所以结果中的元素数量是stop-start
start或stop都是可以省略的,此时他们分别默认为序列 的起始处和结尾处:

数据结构和序列
负数索引从序列的末尾开始切片:

数据结构和序列
还可以在第二个冒号后面加上步长(step)。比如每个一位取出一个元素:

数据结构和序列

实现列表或元组的反序:
数据结构和序列
三、一些内置的序列函数

3.1  enumerate
#在对一个序列进行迭代时,常需要跟踪当前的索引:
i=0
for i in collection:
    #用value做一些事情
    i +=1
   
由于很常见,所以python就内置了一个enumerate函数,它可以逐个返回序列的(i,value)元组:
for i,value in enumerate(collection):
    #用value做一些事情
在对数据进行索引时,enumerate还有一种不错的使用模式,即求取一个将序列值(假定是唯一的)映射到其所在位置的字典。
数据结构和序列
3.2 sorted

sorted函数可以将任何序列返回为一个新的有序列表:
数据结构和序列

常常将sorted和set结合起来使用以得到一个由序列中的唯一元素组成的有序列表.
数据结构和序列
3.3
zip
用于将多个序列(列表、元组等)中的元素配对,从而产生一个新的元组列表,这个(列表)可迭代对象可以使用循环的方式列出其元素

数据结构和序列

zip可以接受任意数量的序列,最终得到的元组数量由最短的序列决定:
数据结构和序列
zip最常见的用法是同时迭代多个序列,还可以结合enumerate一起使用:
数据结构和序列

对于”已压缩“的(zipped)序列,zip还有一个用法,即对该序列进行”解压“(unizip)。其实就是将一组行转换为一组列。
数据结构和序列
函数调用中*的用法相当于:
zip(seq[0],seq[1],seq[2],...seq[len(seq)-1])

3.4  reversed
reversed
用于按逆序迭代序列中的元素:
数据结构和序列
四、字典dict

字典(dict)常见的名字是哈希映射(hash map)或相连数组(associate array).它是一种大小可变的键值对集,其中的键(key)和值(value),
    都是python对象。创建字典的方式之一是:使用大括号{ }并用冒号分隔键和值。

数据结构和序列

访问(以及插入、设置)元素的语法跟列表和元组是一样的:

数据结构和序列

你可以判断字典中是否存在某个键,其语法跟在列表和元组中判断是否存在某个值是一样的:
数据结构和序列
使用del关键字或pop方法(删除指定值之后将其返回)可以删除值:
数据结构和序列
keys和values方法分别用于获取建和值的列表。虽然键值对没有特定的顺序,但这两个函数会以相同的顺序输出建和值:

数据结构和序列

利用update方法,一个字典可以被合并到另一个字典中去:
数据结构和序列
有时候可能会想将两个序列中的元素两两配对地组成一个字典。所以可能会有这样的代码:
数据结构和序列
从序列类型创建字典
由于字典本质上就是一个二元元祖集,所以我们可以用dict类型函数直接处理二元元组列表:
默认值数据结构和序列

下面这样的逻辑很常见:
if key in some_dict:
    value=some_dict[key]
else:
    value=default_value

其实dict的get和pop方法可以接受一个可供返回的默认值,于是,上面的if-else块就可以被简单地写成:
value=some_dict.get(key,default_value)
其实dict的get和pop方法可以接受一个可供返回的默认值,于是,上面的if-else块就可以被简单地写成:
value=some_dict.get(key,default_value)
如果key不存在,则get默认返回None,而pop则会引发一个异常。在设置值的时候,常常会将字典中的值处理成别的集类型(比如列表)
例如:根据首字母对一组单词进行分类并最终产生一个由列表组成的字典。
数据结构和序列

字典的setdefault方法刚好能达到这个目的。上面的if-else可以写成:
数据结构和序列
内置的collection模块有一个叫做defaultdict的类,它可以使该过程更简单,传入一个类型或函数(用于生产字典各插槽所使用的默认值

相关文章: