Table of Contents generated with DocToc

ditctaionary and set

hash 介绍

  hash是计算机中非常常见一种查找的手法,它可以支持常数时间的insert、remove、find,但是对于findMin、findMax、sort等操作就支持的不是很好,具体是为什么呢;

  hash其实是通过key来找value的,可以这样简单的理解为value都被存在一个数组之中,每次你用key计算一下可以得到相应数组的下标,即 index=f(key) 是不是一下子就找到元素所在位置了呢!

集合-set

  集合(set)是一类容器,元素没有先后顺序,并且元素的值不重复。

  集合的字面量用花括号{}

eg:

  • {1,5,7}
  • {'apple', 'orange', 'pear', 'banana'}

创建

  • 直接给变量赋值一个集合字面量

    fruit = {'apple', 'orange', 'pear', 'banana'}

  • 使用set()创建一个空集合

    emp = set()

    注:emp = {} #创建一个空字典

  • 使用set()将列表或元组转换成集合

    prime = set([1,3,5,7,11])

    结果是:

    {1, 3, 5, 7, 11}

操作和访问集合的元素

可以用add()和remove()添加和删除集合元素

可以用min()、max()、len()和sum()对集合操作。

集合内的元素是无序的,所以不能像列表那样通过下标来访问集合元素。

  • 用循环实现遍历集合中的各个元素
s = {2,3,5,7,11}
for i in s:
print(i,end='')
#输出:
#235711
  • 运算符in和not in 用于判断某个元素是否在集合中。
s = {2,3,5,7,11
print(5 in s)
print(4 not in s)
输出:
True
True

子集、超集、相对判断

  • 如果集合s1中的元素,同样都在集合s2中,则称s1为s2的子集,s2为s1的超集。

    使用s1.issubset(s2)来判断s1是否为s2的子集。

    使用s2.issuperset(s1)来判断s1是否为s2的超集。
s1 = {2,3,5,7}
s2 = {1,2,3,4,5,6,7}
print(s1.issubset(s2))
print(s2.issuperset(s1))
输出:
True
True
  • 使用关系运算符==和!=

    - 判断2个集合包含的元素完全相同与否。

  • 使用关系运算符<,<=,>,>=。

    - 如果s1是s2的真子集,则s1<s2是True

    - 如果s1是s2的子集,则s1<=s2是True

    - 如果s1是s2的真超集,则s1>s2是True

    - 如果s1是s2的超集,则s1>=s2是True

    - 注:s1是s2的真子集的意思是s1是s2的子集,但是s2中至少有一个s1中不存在的元素; s1是s2的真超集的意思是s1是s2的超集,但是s1中至少有一个s2中不存在的元素。

  • 通过集合的函数或运算符进行集合的并集、交集、差集和对称差的集合运算。

运算 函数 运算符 说明
并集 union() | 同数学中的并集
交集 intesection() & 同数学交集
差集 difenrence() - s1-s2出现在s1不出现在s2
对称差 symmertric_diference() ^ s1^s2=s1

字典-dictionary (map)

  字典是一个用“键”做索引来存储的数据的集合。一个键和它所对应的数据形成字典中的一个条目。字典的key是用来做hash运算的,需要不可变对象,如数字、字符串、元组;可变的对象不可以作为key,如list、dictionary、set

创建字典

  • 用花括号{ } 来表示,每个元素用冒号分隔键和数据。可以用{}或者dict()来创建空字典。
students = {3180101:’张三’, 3180102:’李四’, 3180105:’王五’, 3180110:’赵六’}
d={'math': '0001', 'python': '0002', 'c': '0003'} d=dict([("math","0001"),("python","0002"),("c","0003")]) d=dict(math="0001",python="0002",c="0003")

字典的基本运算

  • 访问和修改条目

    直接用[ ]运算符,用<字典> [键]的形式,访问键所对应的数据。
score = {'张三':78, '李四':92}
print(score['张三'])#访问score中键为'张三'的数据
score['李四'] = 89#把score中键为'李四'的数据修改为89
score['王五'] = 100#score中没有键为‘王五’的元素,则增加一项,键为’王五’,数据为100。
print(score)
输出:
78
{'张三': 78, '李四': 89, '王五': 100}
  • 删除条目

    del dictName[key]

    如果key不存在,会抛出KeyError异常

  • 遍历字典

# 循环
score = {'张三':78, '李四':92, '王五':89}
for name in score:
print(name + ':' + str(score[name])) #用items()
for key,value in score.items():
print(key + ':' + str(value))
输出:
张三:78
李四:92
王五:89
  • 字典的大小len()

  • 检测,in 和not in检测key是否在字典中

  • 用==和!=比较2个字典是否相同(键和值都相同)

  • 字典常用函数

函数 说明
keys() 返回由全部key组成的序列
values() 返回由全部值组成的序列
items() 返货一个序列,每一项都是一个tuple,(key,value)
clear() 删除所有条目
get(key,value) 返回这个键所对应的值,如找不到返回value
pop(key) 返回这个键所对应的值,同时删除这个条目

可变对象和不可变对象

可变对象和不可变对象是Python语言的核心概念。

  • 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
  • 可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址。
  • 不可变数据类型创建不可变对象,可变数据类型创建可变对象
  • 可变类型有:列表、集合、字典
  • 不可变类型有:整数、浮点数、复数、字符串、逻辑量(True False)、元组
  • 不同数据类型对象和逻辑值的变换
    数据类型 True False
    整数 非0 0
    浮点数 非0 0.0
    复数 非0 0+0j
    字符串 非空 ""
    逻辑量 True False
    列表 非空 []
    元组 非空 ()
    集合 非空 set()
    字典 非空 {}

应用

set

  • 列表去重
#去重,但不能保证保持原有顺序
mailto = ['cc', 'bbbb', 'afa', 'sss', 'bbbb', 'cc', 'shafa']
addr_to =list(set(mailto))
print(addr_to)
#result ['shafa', 'cc', 'sss', 'afa', 'bbbb']
#排序后保证保持原有顺序
addr_to.sort(key = mailto.index)
print(addr_to)
#result ['cc', 'bbbb', 'afa', 'sss', 'shafa']

找鞍点

n=int(input())
a=[]
for i in range(0,n):
b=input().split()
a.insert(i,b)
c=[]
d=[]
for i in range(0,n):
maxa=max(int(a[i][j]) for j in range(n))
mina=min(int(a[k][i]) for k in range(0,n))
c+=[(i,j) for j in range(n) if int(a[i][j])==maxa]
d+=[(k,i) for k in range(n) if int(a[k][i])==mina]
c=list(set(c)&set(d))
if (c!=[]):
print(c[0])
else:
print("NONE")

dictionary

  • 字典替代分支语言
#输入一个1到7的数字,输出对应的星期名的缩写
days={1:"Mon",2:"Tue",3:"Wed",4:"Thu",5:"Fri",6:"Sat",7:"Sun"}
num=int(input())
print(days[num]) result={"+":"x+y","-":"x-y","*":"x*y","/":'''x/y if y!=0 \
else "divided by zero"'''}
x=int(input())
z=input().strip()
y=int(input())
r=eval(result.get(z))#计算表达式的值
if type(r)!=str:
print(format(r,'.2f'))
else:
print(r)
  • 字典计数

eg:1

#输入一行字符,求字符”a”,”b”和”c”出现的次数

diccount={char:0 for char in "abc"}   #字典初始化
s=input()
lst=[char for char in s if
ord("a")<=ord(char)<=ord("c")]
for char in lst:
diccount[char]+=1
print(diccount)

eg2:

#输入一行字符,求每个字符出现的次数
#建字典dicchar,键是字符,值是字符出现的次数。由于不能预知出现哪些字符,所以不能预先初始化字典
#注意字典的get函数:get() 函数返回指定键的值,如果值不在字典中返回默认值。countchar.get(c,0)函数返回键为c的值, 不在字典中返回0。 str=input()
countchar={} for c in str:
countchar[c]=countchar.get(c,0)+1
print(countchar)

eg:

#求列表中两数之和等于指定数的下标
'''
Given nums = [2, 11,7, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 2].
'''
nums = [2, 6, 11, 15,7,8]
target = 9 hm = dict()
for i in range(len(nums)):
if nums[i] in hm:
print(hm[nums[i]], i)
break
hm[target - nums[i]] = i
print([2, 6, 11, 15,7,8])
print(hm)
  • 字典列表嵌套
books=[
{"name":u"C#从入门到精通","price":25.7,"store":u"卓越"},
{"name":u"ASP.NET高级编程","price":44.5,"store":u"卓越"},
{"name":u"Python核心编程","price":24.7,"store":u"当当"},
{"name":u"JavaScript大全","price":45.7,"store":u"当当"},
{"name":u"Django简明教程","price":26.7,"store":u"新华书店"},
{"name":u"深入Python","price":55.7,"store":u"新华书店"},
] print(min([item["price"] for item in books ]))
#24.7
books[0]['name']
#C#从入门到精通
  • 字典嵌套
users = {'aeinstein': {'first': 'albert',
'last': 'einstein',
'location': 'princeton'},
'mcurie': {'first': 'marie',
'last': 'curie',
'location': 'paris'},
} for username, user_info in users.items():
print("\nUsername: " + username)
full_name = user_info['first'] + " " + user_info['last']
location = user_info['location'] print("\tFull name: " + full_name.title())
print("\tLocation: " + location.title())
'''
Username: aeinstein
Full name: Albert Einstein
Location: Princeton Username: mcurie
Full name: Marie Curie
Location: Paris
'''
  • 图和字典
# %% 求图的顶点数,边数,边的总长  空字典{},空集合 set()
d={"start": {1:1,2:2,3:4}, #第一个点为“start”,一条边指向1,长度为1,一条指向2,长度为2,一条指向3,长度为4
1:{3:5},
2:{"end":8,3:78},
3:{2:4,"end":8},
"end":{} }
v=set(); e=set() ;s=0 #顶点的集合,边点的集合
for key,value in d.items():
v.add(key)
if type(value)==dict:
for key1,value1 in value.items():
v.add(key1)
e.add((key,key1))
s+=value1 print(len(v),len(e),s)
#5 8 110
  • 组装字典
id = "IAD"
location = "Dulles Intl Airport"
max_temp = 32
min_temp = 13
precipitation = 0.4 print("{id:3s} : {location:19s} : {max_temp:3d} / {min_temp:3d} /{precipitation:5.2f}".format(
id=id, location=location, max_temp=max_temp,
min_temp=min_temp, precipitation=precipitation)) data = dict(
id=id, location=location, max_temp=max_temp,
min_temp=min_temp, precipitation=precipitation
)
print("{id:3s} : {location:19s} : {max_temp:3d} / {min_temp:3d} /{precipitation:5.2f}".format_map(data)) #IAD : Dulles Intl Airport : 32 / 13 / 0.40
#IAD : Dulles Intl Airport : 32 / 13 / 0.40
#date={'id': 'IAD', 'location': 'Dulles Intl Airport', 'max_temp': 32, 'min_temp': 13, 'precipitation': 0.4}

参考文档

[python官方文档]https://docs.python.org/3.8/library/stdtypes.html#set-types-set-frozenset

注:如有侵权联系作者删帖

python 集合(set)和字典(dictionary)的用法解析的更多相关文章

  1. Swift 字典 Dictionary基本用法

    import UIKit /* 字典的介绍 1.字典允许按照某个键访问元素 2.字典是由两部分组成, 一个键(key)集合, 一个是值(value)集合 3.键集合是不能有重复的元素, 值集合可以有重 ...

  2. javascript实现集合Set、字典Dictionary、HashTable

    集合是由一组无序且唯一(即不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,但应用在计算机科学的数据结构中. function Set() { this.items = {}; } S ...

  3. python学习笔记(6)——字典(Dictionary)

    dict= {key1 : value1, key2 : value2 ...} 关键词:字典中元素成对出现- key:value 格式- 两端{ } ,键:值,每对键值间用 ,隔开. 键key-唯一 ...

  4. python集合与字典的用法

    python集合与字典的用法 集合: 1.增加  add 2.删除   •del 删除集合 •discard(常用)删除集合中的元素  #删除一个不存在的元素不会报错 •remove 删除一个不存在的 ...

  5. python中集合set,字典dict和列表list的区别以及用法

    python中set代表集合,list代表列表,dict代表字典 set和dict的区别在于,dict是存储key-value,每一个key都是唯一的,set相对于dict存储的是key,且key是唯 ...

  6. python 数据类型: 字符串String / 列表List / 元组Tuple / 集合Set / 字典Dictionary

    #python中标准数据类型 字符串String 列表List 元组Tuple 集合Set 字典Dictionary 铭记:变量无类型,对象有类型 #单个变量赋值 countn00 = '; #整数 ...

  7. [转]Python 的列表解析式,集合解析式,字典解析式

    Python 的列表解析式,集合解析式,字典解析式 这三种都是 python 里面的语法糖. 语法糖,Syntactic Sugar,就是为了写程序时候少出错,发明的一些简便的方法,但不影响这个语法的 ...

  8. [Python]字典Dictionary、列表List、元组Tuple差异化理解

    概述:Python中这三种形式的定义相近,易于混淆,应注意区分. aDict={'a':1, 'b':2, 'c':3, 'd':4, 'e':5} aList=[1,2,3,4,5] aTuple= ...

  9. C#中数组、集合(ArrayList)、泛型集合List<T>、字典(dictionary<TKey,TValue>)全面对比

    C#中数组.集合(ArrayList).泛型集合List<T>.字典(dictionary<TKey,TValue>)全面对比 为什么把这4个东西放在一起来说,因为c#中的这4 ...

随机推荐

  1. HTTP2.0学习 与 Nginx和Tomcat配置HTTP2.0

    目录 一.HTTP2.0 1.1 简介 1.2 新的特性 1.3 h2c 的支持度 二.Nginx 对 http2.0 的支持 2.1 Nginx 作为服务端使用http2.0 2.2 Nginx 作 ...

  2. Spring WebFlux 入门

    1. WebFlux介绍 Spring WebFlux 是 Spring Framework 5.0中引入的新的响应式web框架.与Spring MVC不同,它不需要Servlet API,是完全异步 ...

  3. 洛谷1265prim算法求最小生成树

    题目链接:https://www.luogu.com.cn/problem/P1265 最小生成树的prim算法跟dijkstra算法非常像,就是将点分成两个集合,一个是已经在生成树中的点的集合,一个 ...

  4. 洛谷1074 靶状数独dfs 排序、记录、搜索

    题目网址:https://www.luogu.com.cn/problem/P1074 大意就是在一个9*9的数独中填数,要求行列宫都是九个互不相同的数字,给定一定的得分机制,要求求解最大得分.思路大 ...

  5. java触发full gc的几种情况概述

    前言 近期被问及这个问题,在此记录整理一下. System.gc()方法的调用 此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full ...

  6. python之目录

    一.python基础 ​ python之字符串str操作方法 ​ python之int (整型) ​ python之bool (布尔值) ​ python之str (字符型) ​ python之ran ...

  7. java并发安全

    本次内容主要线程的安全性.死锁相关知识点. 1.什么是线程安全性 1.1 线程安全定义  前面使用8个篇幅讲到了Java并发编程的知识,那么我们有没有想过什么是线程的安全性?在<Java并发编程 ...

  8. LoardPe与Import REC X64dbg脚本 脱壳 Upx

    目录 LoardPe与Import REC X64dbg脚本 脱壳 Upx 一丶X64dbg调试器与脚本 1.1 起因 1.2 脚本的调试 1.3 Upx脱壳脚本 二丶LoardPe 内存Dump与I ...

  9. coding++:JS/jQuery获取兄弟姐妹等元素

    jQuery获取: jQuery.parent(expr),找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span") ...

  10. dyld

    一.介绍 在 MacOS 和 iOS 上,可执行程序的启动依赖于 xnu 内核进程运作和动态链接加载器 dyld. dyld 全称 the dynamic link editor,即动态链接器,其本质 ...