字典、集合的使用

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

  

时间: 2024-10-10 01:59:03

字典、集合的使用的相关文章

python :列表 字典 集合 类 ----局部变量可以改全局变量

#列表 字典 集合 类 ----局部变量可以改全局变量,除了整数和字符串 names=["alex","jack","luck"] def func(names): names[0]='金角大王' print("inside name:" ,names) func(names) print (names) #字符串 name='jack' name1=name name='jack_chen' print(name,name1

python中列表 元组 字典 集合的区别

列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. (1)列表 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单.比如,统计过去一周我们买过的东西,把这些东西列出来,就是清单.由于我们买一种东西可能不止一次,所以清单中是允许有重复项的.如果我们扩大清单的范围,统计我们过去一周所有的花费情况,那么这也是一个清单,但这个清单里会有类别不同的项,比如我们买东西是一种花费,交水电费也是一种花费,这些项的类型是可以使不同的.pyt

【学习ios之路:Object-C】字典.集合.

1.不可变数据字典(NSDicionary) 字典:用来存储具有一一对应关系的数据. 一个key 对应一个 value ,key起到了唯一标示的作用,key必须是唯一的,但是一个vlaue可以对应多个key. 字典存储的是无序的元素,一对键值对组成了字典中的一个元素. ①.不可变字典初始化赋值 <span style="font-size:18px;"> //笑笑语法 NSDictionary *dic = @{@"name":@"zhangd

Swift字典集合

字典表示一种非常复杂的集合,允许按照某个键来访问元素.字典是由两部分集合构成的,一个是键(key)集合,一个是值(value)集合.键集合是不能有重复元素的,而值集合是可以重复的,键和值是成对出现的. 如下图所示是字典结构的"学号与学生"集合,学号是键集合,不能重复,学生是值集合,可以重复. 提示 字典中键和值的集合是无序的,即便在添加的时候是按照顺序添加的,当取出这些键或值的时候,也会变得无序.字典集合更适合通过键快速访问值,就像查英文字典一样,键就是要查的英文单词,而值是英文单词的

OC 字典 集合

用字典能有什么好处? 字典是个大容器,它能够储存多个数据 用字典存储的数据具有一一对应的关系(使用key来标识value) 字典中一对键值对(key-value)叫做字典中的一个元素,也叫一个条目,只要是对象就可以,不限制类型 字典是无序的 字典中的key是唯一的,一个key只能对应一个value,一个value可以对应多个key 创建字典对象: 1.便利构造器(+号方法): NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKe

c#将枚举转换成字典集合

枚举在软件开发中的用途 1. 枚举类型(enum type)是具有一组命名常量的独特的值类型. 2. 枚举的定义: public enum Sex { 男 = 0, 女 = 1 } 或者:如果只给男赋值,那么女=1 public enum Sex { 男 = 0, 女 } 3. 我们在实际开发中,对于数据库的设计会经常需要很多状态字段(比如性别.审核状态.分类状态等等等等),而这些状态字段的值又只有固定的几个,这个时候我们一般会需要数据字典来维护这些数据.而数据字典该以什么形式存在呢? 以我自己

python基础一 -------如何在列表字典集合中根据条件筛选数据

如何在列表字典集合中根据条件筛选数据 一:列表 先随机生成一个列表,过滤掉负数 1,普通for循环迭代判断 2,filter()函数判断,filter(函数,list|tuple|string) 1 filter(lambda x:x>0,data) 3,列表推倒式 4,效率对比:还是列表推导式稍高 二:字典 1,跟列表类似,推导式 先生成随机的字典(key从1-20) 过滤掉value是负数的值 三:集合 随机生成10个元素的集合 过滤掉小于0的元素,跟字典类似

初识Swift集合之字典集合

字典集合 字典表示一种非常复杂的集合, 允许按照某个键来访问元素 字典集合的声明与初始化: var strudentDictionary1 : Dictionary<Int , String> = [102 : " Jack" , 105 : "Mark" , 107 : "Jay"] ; //这里声明里一个strudentDictionary1 的字典集合,他的键是 Int 类型,他的值为String类型 var strudentD

.Net学习笔记----2015-06-25(File类的读写文件、List泛型集合、装箱和拆箱、Dictionary字典集合)

File类:静态类,Create Delete Copy Move ,主要用来对数据对文本文件进行读写 File类:缺点:只能读写小文件 读写操作: //byte[] buffer = File.ReadAllBytes(@"C:\Users\Administrator\Desktop\new.txt"); ////将字节数组中的每一个元素都要按照我们指定的编码各式解码成字符串 ////UTF-8 GB2312 GBK ASCII Unicode //string s = Encodi

WPF TreeView绑定字典集合

1 <TreeView Name="Tree" HorizontalAlignment="Left" Height="269" Width="292" > 2 3 <TreeView.ItemTemplate> 4 <HierarchicalDataTemplate ItemsSource="{Binding Value}"> 5 <StackPanel> 6