数据结构可以说是相互之间存在一种或者多种特定关系的数据类型的集合,相比于其他编程语言Python的数据结构更加灵活。
Python中常用的序列结构有:列表、元组、字典、集合、字符串等。
有序序列:列表、元组、字符串
无序序列:字典、集合、(range、Zip、map、enumerate等)
其中,列表、字典、集合又属于可变序列,其余属于不可变序列
序列是Python中最基本的数据结构。列表元组字符串等序列支持双向索引。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
1. 列表[list]
列表是连续有序内存空间。同一个列表中元素的数据类型可以各不相同,可同时为整数,实数,字符串等类型,也可为列表,元组,字典,集合或其他自定义对象。
注:Python采用的是基于值的内存管理模式,列表中元素是存储值的引用。
列表操作:
Python 表达式 | 结果 | 描述 |
---|---|---|
len([1, 2, 3]) | 3 | 长度 |
[1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | 组合 |
['Hi!'] * 4 | ['Hi!', 'Hi!', 'Hi!', 'Hi!'] | 重复 |
3 in [1, 2, 3] | True | 元素是否存在于列表中 |
for x in [1, 2, 3]: print x, | 1 2 3 | 迭代 |
列表函数:
1 | cmp(list1, list2) 比较两个列表的元素 |
2 | len(list) 列表元素个数 |
3 | max(list) 返回列表元素最大值 |
4 | min(list) 返回列表元素最小值 |
5 | list(seq) 将元组转换为列表 |
常用方法:
1 | list.append(x) 在列表末尾添加新的元素x |
2 | list.count(x) 返回指定元素x在列表中出现的次数 |
3 | list.extend(L) 将列表L所有元素添加至列表list尾部 |
4 | list.index(x) 返回列表中第一个值为x的元素的下表,若不存在则抛出异常 |
5 | list.insert(index, x) 指定位置插入元素x,后面元素后移一个位置 |
6 | list.pop(obj=list[-1]) 移除并返回列表中的指定位置的一个元素(默认最后一个元素-1) |
7 | list.remove(x) 移除列表中首次出现的指定元素 |
8 | list.reverse() 逆序 |
9 | list.sort(key,reverse=False) 排序:key指定排序依据,reverse指定升序(False)还是降序(True) |
2. 元组(tup)
Python的元组与列表类似,不同之处在于元组的元素不能修改。
序号 | 方法及描述 |
---|---|
1 | cmp(tuple1, tuple2) 比较两个元组元素。 |
2 | len(tuple) 计算元组元素个数。 |
3 | max(tuple) 返回元组中元素最大值。 |
4 | min(tuple) 返回元组中元素最小值。 |
5 | tuple(seq) 将列表转换为元组。 |
3. 字典{}
字典由键和对应值成对组成。字典也被称作关联数组或哈希表,键必须独一无二,但值则不必。值可以取任何数据类型,但必须是不可变的,如字符串,数或元组。
dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
print dict['Name'] #访问
向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对
dict['Beth']=100 #update
dist['Age']=7 #add
del dict['Name']; # 删除键是'Name'的条目 dict.clear(); # 清空词典所有条目 del dict ; # 删除词典
1)不允许同一个键出现两次 2)键必须不可变,所以可以用数,字符串或元组充当,所以用列表就不行, 字典函数:
1 | cmp(dict1, dict2) 比较两个字典元素。 |
2 | len(dict) 计算字典元素个数,即键的总数。 |
3 | str(dict) 输出字典可打印的字符串表示。 |
4 | type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。 |
常用方法:
1 | radiansdict.clear() 删除字典内所有元素 |
2 | radiansdict.copy() 返回一个字典的浅复制 |
3 | radiansdict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值 |
4 | radiansdict.get(key, default=None) 返回指定键的值,如果值不在字典中返回default值 |
5 | radiansdict.has_key(key) 如果键在字典dict里返回true,否则返回false |
6 | radiansdict.items() 以列表返回可遍历的(键, 值) 元组数组 |
7 | radiansdict.keys() 以列表返回一个字典所有的键 |
8 | radiansdict.setdefault(key, default=None) 和get()类似, 但如果键不已经存在于字典中,将会添加键并将值设为default |
9 | radiansdict.update(dict2) 把字典dict2的键/值对更新到dict里 |
10 | radiansdict.values() 以列表返回字典中的所有值 |
4. 集合{}
关于集合,维基百科这样描述:
集合是基本的数学概念,它是集合论的研究对象,指具有某种特定性质的事物的总体,(在最原始的集合论─朴素集合论─中的定义,集合就是“一堆东西”。)集合里的事物(“东西”),叫作元素。若然 x 是集合 A 的元素,记作 x ∈ A。
在 Python 中,集合分为两类:
set:可变集合,可原地修改(可哈希)
frozenset:不可变集合,相反
frozenset:不可变集合,相反
方法 | 描述 |
---|---|
add() | 将元素添加到集合中 |
clear() | 删除集合中的所有元素 |
copy() | 返回集合的浅拷贝 |
difference() | 将两个或多个集合的差集作为一个新集合返回 |
difference_update() | 从这个集合中删除另一个集合的所有元素 |
discard() | 删除集合中的一个元素(如果元素不存在,则不执行任何操作) |
intersection() | 将两个集合的交集作为一个新集合返回 |
intersection_update() | 用自己和另一个的交集来更新这个集合 |
isdisjoint() | 如果两个集合有一个空交集,返回 True |
issubset() | 如果另一个集合包含这个集合,返回 True |
issuperset() | 如果这个集合包含另一个集合,返回 True |
pop() | 删除并返回任意的集合元素(如果集合为空,会引发 KeyError) |
remove() | 删除集合中的一个元素(如果元素不存在,会引发 KeyError) |
symmetric_difference() | 将两个集合的对称差作为一个新集合返回 |
symmetric_difference_update() | 用自己和另一个的对称差来更新这个集合 |
union() | 将集合的并集作为一个新集合返回 |
update() | 用自己和另一个的并集来更新这个集合 |
我们在高中时曾学过,集合有以下特性:
- 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。
集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。 - 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
有时需要对同一元素出现多次的情形进行刻画,可以使用多重集,其中的元素允许出现多次。 - 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。