在java中的集合在开发中用的最多的,也是我们最长用的数据结构了。那么python中的对应的是怎么样的呢
一、List
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
1、定义list方式
num_list = [1, 2, 3]
num_list = range(10)
注意:list的元素可以是不同类型的,例如:
num_list = [1,'22',1.6]
2、取值、添加、删除元素
取值:使用下标索引(从0开始,同时支持从后往前取值)
num_list = ['凯文-杜兰特', '克莱-汤普森', '斯蒂芬-库里']
print(num_list[0])
print(num_list[-1])
print(num_list[-2])
结果:
凯文-杜兰特
斯蒂芬-库里
克莱-汤普森
注意:(如果索引越界,则会报异常)
Traceback (most recent call last):
File "D:/intelljcode/mypython/mypython/colection.py", line 6, in <module>
print(num_list[4])
IndexError: list index out of range
3、添加元素
num_list = ['凯文-杜兰特', '克莱-汤普森', '斯蒂芬-库里']
num_list.append("德拉蒙德-格林")
num_list.insert(2, "安德烈-伊戈达拉")
print(num_list)
结果:['凯文-杜兰特', '克莱-汤普森', '安德烈-伊戈达拉', '斯蒂芬-库里', '德拉蒙德-格林']
4、删除元素
num_list = ['凯文-杜兰特', '克莱-汤普森', '斯蒂芬-库里']
num_list.pop()
num_list.remove('凯文-杜兰特')
print(num_list)
结果是:['克莱-汤普森', '安德烈-伊戈达拉', '斯蒂芬-库里']
注意:(如果list为空使用pop()则会报异常,如果要删除的元素没有而使用remove('xxx')同样也会报异常,所以要操作前做为空和是否存在该元素判断)
num_list = ['凯文-杜兰特', '克莱-汤普森', '斯蒂芬-库里']
if'克莱-汤普森' in num_list:
num_list.remove('克莱-汤普森')
print(num_list)
5、遍历元素
遍历元素是特别常用的操作
方式一:
for player in num_list:
print(player)
方式二:
for i in range(len(num_list)):
print(num_list[i])
二、tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。
all_start = ('凯文-杜兰特', '克莱-汤普森', '斯蒂芬-库里')
print(all_start[1])
结果是:克莱-汤普森
现在,classmates这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0]
,classmates[-1]
,但不能赋值成另外的元素。
all_start = ('凯文-杜兰特', '克莱-汤普森', '斯蒂芬-库里')
all_start[1] = 'KD'
print(all_start)
结果出异常:
Traceback (most recent call last):
File "D:/intelljcode/mypython/mypython/colection.py", line 38, in <module>
all_start[1] = 'KD'
TypeError: 'tuple' object does not support item assignment
不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,比如:但是一个元素的时候则需要加,区分括号的含义,如果没有括号则被解释器当做计算中的()。
t = (1)
print(t)
结果为:1
t = (1,)
print(t)
结果为(1,)
注意:tuple元组中的元素不可变是:对于基本数据类型则是内容不可变,比如int、long等。对于引用指该引用不可变。
比如:
t = (1, 2, ['xwl', 'wl'])
t[2][0] = 'yzq'
print(t)
结果为:(1, 2, ['yzq', 'wl'])
三、dict
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度
1、取值
map = {'凯文-杜兰特': 30, '克莱-汤普森': 28, '斯蒂芬-库里': 40}
print(map['凯文-杜兰特']) //根据key取值
print(map.get('凯文-杜兰特')) //根据key取值
print(map.pop('凯文-杜兰特')) //pop节点
print(map)
print(map.items())//取所有的key-value
print(map.keys()) //取所有的key
print(map.values()) //取所有的value
结果
30
30
30
{'斯蒂芬-库里': 40, '克莱-汤普森': 28}
dict_items([('斯蒂芬-库里', 40), ('克莱-汤普森', 28)])
dict_keys(['斯蒂芬-库里', '克莱-汤普森'])
dict_values([40, 28])
2、遍历
map = {'凯文-杜兰特': 30, '克莱-汤普森': 28, '斯蒂芬-库里': 40}
for key, value in map.items():
print(key,value)
结果:
斯蒂芬-库里 40
克莱-汤普森 28
凯文-杜兰特 30
如果key不存在,dict就会报错:
d['Thomas']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Thomas'
要避免key不存在的错误,有两种办法,一是通过in
判断key是否存在:
'Thomas' in d
False
二是通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:
d.get('Thomas')
d.get('Thomas', -1)
-1
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key
由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:
d['Jack'] = 90
d['Jack']
90
d['Jack'] = 88
d['Jack']
88
三、Set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复、无序的,所以,在set中,没有重复的key。(可以用来去重)
要创建一个set,需要提供一个list作为输入集合:
s = set([1,2,3])
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
s = set([1, 2, 3])
s1 = set([2, 3, 4, 5])
print(s&s1)
print(s|s1)
结果是:
{2, 3}
{1, 2, 3, 4, 5}