之所以称他们为容器类型是因为他们不像基本类型那样只有一种简单类型的数据,而是可以包含其他类型的数据,numpy的计算速度比原生Python快的一个很重要的原因就是numpy中的数组(类似于Python中的嵌套列表)元素类型都是一致的。
列表和元组时有序列表,可以通过索引选取其中的元素,集合是无序列表,导出的顺序不等于显示顺序。
根据索引访问列表和元组中的元素时,索引可以为负数:
>>> classmates = ['Michael', 'Bob', 'Tracy'] >>> classmates ['Michael', 'Bob', 'Tracy']
>>> classmates[0]
'Michael' >>> classmates[1] 'Bob' >>> classmates[2] 'Tracy'
>>> classmates[-1]
'Tracy
定义一个只有1个元素的tuple时,只有1个元素的tuple定义时必须加一个逗号以消除歧义,否则,编译器会误解成数学计算意义上的括号:
>>> t = (1)
>>> t
1
下面才是一个元素的元组的正确定义方法:
>>> t = (1,)
>>> t
(1,)
说元组不可变是指它的索引指向不变,但若索引所指的元素也是个容器类型(比如列表类型),那这个列表中的元素是可以变得:
>>> t = ('a', 'b', ['A', 'B']) >>> t[2][0] = 'X' >>> t[2][1] = 'Y' >>> t ('a', 'b', ['X', 'Y'])
元组在很多方面类似于列表; 其中一个最重要的区别是元组可以用作字典中的键和集合的元素,而列表则不能(因为tuple不可变而list可变,一个可变的键无法定位正确的value):
d = {(x, x + 1): x for x in range(10)} # Create a dictionary with tuple keys t = (5, 6) # Create a tuple print(type(t)) # Prints "<class 'tuple'>" print(d[t]) # Prints "5" print(d[(1, 2)]) # Prints "1"
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4]) >>> s1 & s2 {2, 3} >>> s1 | s2 {1, 2, 3, 4}