Loading

python 中的“集合”(list、tuple、set、dict)

在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有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

而list相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

所以,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}

posted @ 2017-05-16 00:16  xwlmdd  阅读(481)  评论(0编辑  收藏  举报