字典、集合的使用

Dict:

  在Python中内置了字典:dict,全称是dictionary,使用 键、值的方式来储存数据(key,value),具有很快的查找速度,其中的key是不可变对象。

  例如通过一个学生的名字来查找成绩,在list中的用法是要创建两个list

1 name = ["LiLei","Hanmeimei","Tom","Jack"]
2 score = [50,70,94,41]

通过name中的索引来查找score中的成绩;而使用dict的时候就可以用一个 "名字"-"成绩"的对照表来查找成绩,而且无论dict中的人数有多少,查询速度都不会变慢。

1 result = {"LiLei":50,"Hanmeimei":70,"Tom":94,"Jack":41}
2 print(result["LiLei"])
3 50

为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,有两个办法

1、把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。

2、先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。

  dict就是第二种实现方式,给定一个名字,比如'Lilei',dict在内部就可以直接计算出Lilei对应的存放成绩的"页码",也就是50这个数字存放的内存地址,直接取出来,所以速度非常快。

你可以猜到,这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。

 

增加和更改:

  除了初始化的方法把数据放到dict中,还可以通过添加key来给字典添加元素,需要注意的是字典中的key是唯一性的,如果重复就是会修改value的值。

1 result["Jerry"] = 1000 #在字典中添加新的key和value
2 result["Hanmeimei"] = 88 #修改Hanmeimei的成绩为88
3 print(result)
4 >>>{'Hanmeimei': 88, 'Tom': 94, 'Jerry': 1000, 'Jack': 41, 'LiLei': 50}

查找:

  在查找字典中的元素时,都是通过key来进行查找,但是如果字典中没有key的值就会报错,避免程序报错,有两个办法

  1、通过 in 判断key是否存在

  2、使用get()方法来获取,如果key不存在就返回None.

1 print('alex' in result)
2 >>>False
3 print(result.get('abc'))
4 >>>None
5 print(result.get('Tom'))
6 >>>94

删除:

  dict中通过pop(key)的方法来删除元素,在字典中,元素的排列是无序的

1 result.pop('Hanmeimei')
2 print(result)
3 {'Jack': 41, 'Jerry': 1000, 'Tom': 94, 'LiLei': 50}

和list相比:

  时间 :dict  < list 

  内存 :dict  > list

  可以理解为dict就是牺牲内存换时间的方法。

其他方法


 1 # dict.keys(self)       dict.values(self) 
 2 result = {"LiLei":50,"Hanmeimei":70,"Tom":94,"Jack":41}
 3 resultName = result.keys()
 4 resultScore = result.values()
 5 print(resultName,resultScore)
 6 dict_keys(['Jack', 'LiLei', 'Tom', 'Hanmeimei']) dict_values([41, 50, 94, 70])
 7 
 8 #items(self)
 9 print(result.items())
10 dict_items([('Jack', 41), ('LiLei', 50), ('Tom', 94), ('Hanmeimei', 70)])
result = {"LiLei":50,"Hanmeimei":70,"Tom":94,"Jack":41}
print(result)
result.setdefault("abc",100)
print(result)
{'Jack': 41, 'LiLei': 50, 'Tom': 94, 'Hanmeimei': 70}
{'Jack': 41, 'abc': 100, 'LiLei': 50, 'Tom': 94, 'Hanmeimei': 70}
setdefault:设置默认键值对,与原字典key相同value如果为None则更改,不为None则不变,没有:添加
1 result = {"LiLei":50,"Hanmeimei":70,"Tom":94,"Jack":41,"abc":100}
2 dic = {"Zzz":99,"abc":0}
3 result.update(dic)
4 print(result)
5 {'Zzz': 99, 'Hanmeimei': 70, 'abc': 0, 'Tom': 94, 'LiLei': 50, 'Jack': 41}
update: 更新字典,原字典有相同的key:更改value,没有:添加

dict循环:

1 #方法1
2 for key in info:
3     print(key,info[key])
4 
5 #方法2
6 for k,v in info.items(): #会先把dict转成list,数据量大时莫用
7     print(k,v)

 

集合:

  set和dict类似,也是存储一组无序的key的集合,但不同的是set只存key,不存value,由于key是唯一性,所以set会去重,set中没有重复的key。

  要创建一个set,需要通过list来创建(list中只能有基本数据类型,不可嵌套可迭代数据类型):

1 name = ["LiLei","Hanmeimei","Tom","Jack","Jack"]
2 name = set(name)
3 print(name)
4 >>>{'Hanmeimei', 'Tom', 'Jack', 'LiLei'}

  可以简单的把set理解成数学中的集合,可以得到这个集合的合集,交集,并集,差集,对称差集,判断是否为父集,子集等...

# 合集 | union
number_1 = set([1,2,3,4,5])
number_2 = set([4,5,6,7,8])

number_3 = number_1 | number_2
number_3 = number_1.union(number_2)
print(number_3)
{1, 2, 3, 4, 5, 6, 7, 8}

# 交集 & intersection
number_4 = number_1 & number_2
number_4 = number_1.intersection(number_2)
print(number_4)
{4, 5}

# 差集 - difference  (number_1有number_2没有)
number_5 = number_1 - number_2
number_5 = number_1.difference(number_2)
print(number_5)
{1,2,3}

# 对称差集 ^ symmetric_difference
number_6 = number_1 ^ number_2
number_6 = number_1.symmetric_difference(number_2)
print(number_6)
{1, 2, 3, 6, 7, 8}

# <= t是否为b的子集
t = set([3,4,5])
b = set([3,4,5,6,7])
print(t.issubset(b))
# print(t <= b)
True

# >= t是否为b的父集
print(t.issuperset(b))
# print(t >= b)
False

# 基本操作:

# 添加一项:add
t.add(9)
print(t)
{9, 3, 4, 5}

# 添加多项
print(id(t))
t.update(b)
print(t,id(t))
4332189736
{3, 4, 5, 6, 7, 9} 4332189736

# 删除
t.remove(9)
print(t)
{3, 4, 5, 6, 7}

# t的长度
len(t)

#测试 x 是不是t的成员
x in t

# 测试x 不是t的成员
x not in t

#测试m和l的交集是否为None,如果为None返回True
m = set([12,3,4])
l = set([5,7])
print(m.isdisjoint(l))
True

 

  

posted @ 2017-04-18 15:05  LeeeetMe  阅读(225)  评论(0编辑  收藏  举报