数据结构
在Python中,两个主力数据结构是列表和字典。列表按顺序存储数据,而字典像小型数据库,使用键高效地存储和检索数据。
type 命令
有些情况下,需要检查值或变量的数据类型。这很容易,只需使用内置命令type:
>>> type(5)
<class 'int'>
>>> type(5.0)
<class 'float'>
>>> type('5')
<class 'str'>
>>> type(None)
<class 'NoneType'>
>>> type(print)
<class 'builtin_function_or_method'>
type 命令对调试很用帮助。
序列
在Python中,序列是一组按顺序排列的值。Python有三种内置的序列类型: 字符串、元组和列表。
序列的优点之一是,像字符串一样支持索引和切片。因此,所有序列都具备如下特征。
- 第一个正索引为零,指向左端。
- 第一个副索引为-1,指向右端。
- 可使用切片表示法来复制子序列,例如,seq[begin:end]复制seq的如下元素:从索引begin指向的元素到索引end - 1指向的元素。
- 可使用 + 和 * 进行拼接。要进行拼接,序列化的类型必须相同,即不能拼接元组合列表。
- 可使用函数len计算其长度,例如,len(s) 返回序列s包含的元素数。
- 表达式 x in s 检查序列 s 是否包含元素 x。换句话说,如果 x 位于 s 中,则 x in s 返回 True,否则返回 False。
元组
元组是一种不可变序列,包含零个或更多个值。它可以包含任何Python值,甚至可以包含其他元素。例如:
>>> items = (-6, 'cat', (1, 2))
>>> items
(-6, 'cat', (1, 2))
>>> len(items)
3
>>> items[-1]
(1, 2)
>>> item[-1][0]
1
元组用圆括号括起,其中的元素用逗号分隔。空元祖用 () 表示,但只包含一个元素的元素(单元素元组)采用不同寻常的表示法 (x,),如下所示:
>>> type(())
<class 'tuple'>
>>> type((5,))
<class 'tuple'>
>>> type((5))
<class 'int'>
如果省略单元素元组末尾的逗号,就不是创建元组,而是用圆括号将表达式括起。
元组是不可变的
创建元组后就不能修改它。这种特征并不独特,字符串、整数和浮点都是不可变的。如果要修改元组,就必须创建一个体现更改的新元组。例如:
>>> lucky = (6, 7, 21, 77)
>>> lucky
(6, 7, 21, 77)
>>> lucky2 = lucky[1:]
>>> lucky2
(7, 21, 77)
>>> lucky
(6, 7, 21, 77)
从积极的角度看,不可变杜绝了无意间修改元组的可能性,有助于防范错误;
从消极的角度看,即便对元组做细微的修改,都必须复制整个元组,这增加了修改大型元组所需的时间和内存。如果你发现自己需要频繁的修改某个元组,就应该使用列表代替它。
元组函数
常见的元组函数使用示例:
>>> pets = ('dog', 'cat', 'bird', 'dog')
>>> pets
('dog', 'cat', 'bird', 'dog')
>>> 'bird' in pets
True
>>> len(pets)
4
>>> pets.count('dog')
2
>>> pets.count('fish')
0
>>> pets.index('bird')
2
与字符串一样,也可以使用+
、*
来拼接元组:
>>> tup1 = (1, 2, 3,)
>>> tup2 = (4, 5, 6,)
>>> tup1 + tup2
(1, 2, 3, 4, 5, 6)
>>> tup1 * 2
(1, 2, 3, 1, 2, 3)
列表
列表与元组基本相同,但是列表是可变的。
列表函数
列表函数函数pop删除并返回给指定索引对应的元素
>>> lst = ['a', 'b', 'c', 'd']
>>> lst.pop(2)
'c'
>>> lst
['a', 'b', 'd']
>>> lst.pop()
'd'
>>> lst
['a', 'b']
如果没有向函数pop传递索引,它将删除并返回列表末尾的元素。
函数remove(x) 删除列表中的第一个x元素,但不返回该元素。
关于函数sort(),Python对序列进行排序的方式称为字典顺序。它的基本理念是,首先按第一项对元素排列,如果第一项相同,则按第二项进行排序,如果第二项也想通,则按第三项进行排序,以此类推。
所以Python可以对包含元组的列表排序。
列表解析
>>> [n * n for n in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
列表解析感觉有些像kotlin集合操作符。遍历列表,对每一个元素做一定的处理后返回新的列表。
不同的是,你可以方便的在列表解析中使用字符串。
>>> [c for c in 'pizza']
['p', 'i', 'z', 'z', 'a']
>>> [c.upper() for c in 'pizza']
['P', 'I', 'Z', 'Z', 'A']
使用列表解析进行筛选
>>> nums = [-1, 0, 6, -4, -2, 3]
>>> result = [n for n in nums if n > 0]
>>> result
[6, 3]
相比于常规循环,列表解析更简洁易读。
字典
在存储键值对方面,Python字典是一种效率极高的数据结构。例如:
>>> color = {'red': 1, 'blue': 2, 'green': 3}
>>> color
{'blue': 2, 'green': 3', red': 1}
要访问字典中的值,可使用相应的键:
>>> color['green']
3
使用键来访问字典值的效率极高,几遍字典包含数千个键值对。
Python字典中的每个键都被转为一个数字——散列值,这是使用专门设计的散列函数完成的。字典的值存储在一个底层列表中,并将其散列值用作索引。访问值时,把提供的键转换为散列值,再跳到列表的相应位置。计算散列的细节很复杂,所幸的是,Python为我们处理了这一切。
对键的限制
- 字典中的键必须是独一无二的,如果一个键使用了两次,Python只会存储第二个键值对;
- 键必须是不可变的。因此,字典键不能是列表,可不能使字典。
字典函数
字典函数取值时,如果key没有包含在字典中,将引发KeyError异常。
如果你不清楚某个键是否包含在字典中,可使用key in d 进行检查。这种检查的效率极高,与用于序列的in相比尤其如此。
集合
在Python中,集合是一系列不重复的元素。集合类似于字典,但只包含键,而没有相关联的值。
和Kotlin一样,集合分为两类:可变集合
和不可变集合
。
集合最常见的用途可能是用于删除序列中的重复元素。
>>> lst = [1, 1, 6, 8, 1, 5, 5, 6, 8, 1, 5]
>>> s = set(lst)
>>> s
{8, 1, 5, 6}
与字典一样,集合的元素排列顺序也是不确定的。
网友评论