python集合运算符_Python 集合、字典、运算符

先区分一下序列类型和散列类型:

序列类型:list、string、tuple,他们中的元素是有序的。

散列类型:set、dict,他们中的元素无序的。(注意:python3.7.0开始字典变成"有序"了)

序列类型有序,可以用索引。而散列类型中的元素是无序的,所以不能索引。

一、集合

(一).集合的特性:无序、唯一、可变。集合中的元素需要可哈希的,元素不可以是可变对象。

定义一个集合:

(1).工厂方法:se = set()

注意不要写成 se = () 这样变成元组了。

(2).直接定义:se = {1,2,3} 用大括号括起来。

大括号中要写入元素,不写元素就是一个空字典了。

(3).案例分析:

#分析这两种定义,哪一个会报错?

s1 = {1, ['a', 'b', 'c']}

s2= {1, ('a', 'b', 'c')}

第一种会报错。TypeError: unhashable type: 'list'

因为集合中的元素要符合不可变这个规则, 列表可变,不符合规则,报错了。

第二种,元组不可变,符合规则,所以解释器不会跟你叫劲。

至于什么是可哈希?往下翻……

(二).集合的运算

(1).检查成员:in / not in

语法:item in set_object -> bool

例:

1318010-20180303145349811-868140452.png

not in 就是取反

(2).交集:&

两个集合共同有的元素,取两个集合重复的元素。

例:

ContractedBlock.gif

ExpandedBlockStart.gif

#1.有两个列表 x = [1,2,3,'a','b','c'] y = ['a','b','c'] 找出x,y列表中,共有元素

x= [1, 2, 3, 'a', 'b', 'c']

y= ['a', 'b', 'c']print(set(x) &set(y))"""列表没有交集"&"的功能,但是集合有。

那么先工厂一下,然后再交集。

运行结果:

{'c', 'b', 'a'} # 集合无序,所以元素输出的顺序未必如自己预想的"""

View Code

为什么运行结果的顺序是乱的?因为集合无序的!

(3).并集:|(shift+回车上面那个)

取出不重复的值。字面意思理解,并集,并在一起了(相当于变成一个集合了,集合的特性之一:元素唯一)。

例:

1318010-20180303154712193-1412466578.png

(4).差集:-

剪掉两个集合中的重复部分。

1318010-20180303155336638-1304228782.png

本人数学最烂,就这么死记硬背着,第二个集合后面的元素都会砍掉。

(5).与非集:^(脱字符:shift+6)

取两个集合各自独有的元素。

1318010-20180303155556424-33457786.png

(6).小技巧:如何去重元素?

利用集合的特性之一:唯一性

a = [1, 2, 2, 3, "a", "b", "c", "a", "b", "a", 3]

# 工厂一下,set()print(set(a)) # {1, 2, 3, 'c', 'b', 'a'}

(三).集合的常用方法

(1).set.add() 添加单个元素

(2).set.update(iterable) 批量更新,会去重。

二、字典

(一).字典的特性

1.key唯一

2.无序(散列类型,Python3.7.0之前)

3.可变

key是唯一的,需要的是不可变对象,且要符合变量命名规则。key重名的话,值会被后者所覆盖。

注意版本之间的区别,在Python3.7.0之前:字典是无序的(散列类型);从Python3.7.0开始:字典不再是散列类型了,是按照键的插入顺序进行排列!

4.可以嵌套到任意深度(仅受可用内存约束)

(二).定义一个字典

(1).直接大括号:di = {} 是一个空字典

type(di)之后:

注意要与集合的定义区别开来!定义空集合是:s1 = set()

一般是直接把值写进去,语法:di = {key1:value,key2:value,...} 键值对是冒号的形式

例:

1318010-20180303162618818-106479585.png

(2).工厂方式:di = dict(key1=value,key2=value,...) 键值对用等号"="等起来,工厂方式的key不要加引号!

例:

1318010-20180303162852843-1278634146.png

(3).案例分析:

#分析这两种定义,哪一个会报错?

di1 = {'a': 'test', ('a', 'b'): 'test'}

di2= {'a': 'test', {'a', 'b'}: 'test'}

di2会报错,TypeError: unhashable type: 'set'

key需要是不可变对象。第二种里有一个集合,集合的特性之一是可变,不符合key的规则,解释器跟你急了。

而第一种里是一个元组,元组不可变,没问题了。

另外,内建函数也可以作为字典的key:

ContractedBlock.gif

ExpandedBlockStart.gif

d1 = {len: 1, str: "aaa"}print(d1[len]) #1

print(d1[str]) #'aaa'

View Code

(三).往字典里插入值

ContractedBlock.gif

ExpandedBlockStart.gif

di ={}#直接赋值一样

di["name"] = "quanquan616"

"""get(key) 如果key不存在,不会报错。取到了会返回原有值。

get(key,value) 当key不存在的时候,会返回value的值,常用来提示。"""di.get("sex", "没有这个键")"""如果要插入值,可以这么做:

di["name"] = di.get("name","")+"zyb"

di["sex"] = di.get("sex","male")

di["age"] = di.get("age",0)+30

di -> {'name': 'zyb', 'sex': 'male', 'age': 30}"""

"""setdefault(key,value) 字面理解,设置默认。

key有的话会返回原有值,无此key才会设置。

如果此key已有,不会改变原有值,不会被更新"""di.setdefault("name", "zyb")"""update(dict_object) 参数需要是一个字典对象。

有就改变,没有就添加进去。"""di.update({"age": 35, "read": 15})#fromkeys(iterable,value) 批量设置,所有的值都是一样的。不会改变原有字典

di.fromkeys("abc", 30)print(di)#{'name': 'quanquan616', 'age': 35, 'read': 15}

View Code

(四).对字典进行取值

ContractedBlock.gif

ExpandedBlockStart.gif

#直接用键进行取值,Dict[key]

print(di["name"]) #quanquan616

#get(key) 取到了就返回值,没有取到不会报错

print(di.get("name")) #quanquan616

#get()的另一种用法

di ={}

di["name"] = di.get("name", "") + "zyb"

print(di) #{'name': 'zyb'}

#setdefault(key) 有就返回这个键的值。如果没有这个键,会创建,不指定值的话,会是None。不会因为指定了值而改变原有数据。

print(di.setdefault("name")) #quanquan616

#values() 取出所有的值,返回一个迭代器

print(di.values()) #dict_values(['quanquan616', 35, 15])

View Code

(五).changed in python3.7.0

官方文档对python3.7.0中字典的描述:

Dictionary order is guaranteed to be insertion order.Dictionaries preserve insertion order.

Note that updating a key does not affect the order.Keys added after deletion are inserted at the end.

大意:字典保留的顺序是键插入的顺序,更新值不会影响原有的顺序,但删除后添加的键将在末尾插入。

演示如下:

1318010-20190214164354237-1453536547.png

(六).字典小技巧(以下代码均在python3.7.0中运行)

(1).对字典中的元素进行排序

di = {"in": 123, "to": 511, "she": 255, "i": 111}print(sorted(di.items(), key=lambda item: item[1], reverse=True))#运行结果:[('to', 511), ('she', 255), ('in', 123), ('i', 111)]

"""di.items() 将字典转化为可迭代对象。Dict.items()将字典中的key-value元素,转化为了元组

# [('in', 123), ('to', 511), ('she', 255), ('i', 111)]

key=lambda item: item[1] 取元素中的第二个元素作为比较的参数"""

key是用来指定做排序的每项元素的那个部分。匿名函数的item,就是指代每项元素,item[1]就是元素的第二项的意思。

注意此方法中,value的值只能是数值,如果出现字符串就会报错。(字符串和数值能直接做比较吗?)

(2).对列表中的多个字典排序

ContractedBlock.gif

ExpandedBlockStart.gif

#按age从大到小排序

alist = [{"name": "a", "age": 20}, {"name": "b", "age": 30}, {"name": "c", "age": 25}]

alist.sort(key=lambda item: -item.get("age"))"""key中的lambda表达,等价于下面这种方式。

获得字典中"age"的值,key的意思是以哪个函数为关键字。"""

#def get_sort(li):#return li.get("age")#alist.sort(key=get_sort, reverse=True)

print(alist)#[{'name': 'b', 'age': 30}, {'name': 'c', 'age': 25}, {'name': 'a', 'age': 20}]

View Code

(3).合并字典(键相同则覆盖)

ContractedBlock.gif

ExpandedBlockStart.gif

x = {"a": 1, "b": 2}

y= {"b": 3, "c": 3, "d": 4}

z= {**x, **y}print(z)#{'a': 1, 'b': 3, 'c': 3, 'd': 4}

View Code

(4).字典代替多个if...elif

如下这段if...elif...else语句:

ContractedBlock.gif

ExpandedBlockStart.gif

deffun(x):if x == "a":return 1

elif x == "b":return 2

else:return None

View Code

可以写成更加简洁更加pythonic的代码:

deffun(x):return {"a": 1, "b": 2}.get(x)

dict.get() 如果get不到值会返回None

(5).dict.pop()方法从字典中删除条目。但是,传递给pop()中的参数,必须是字典中存在的键,而不是值。

三、运算符(部分简单的运算符之前已有摘录,不在这里重复了,遇到实际情况不会了直接google it)

(一).身份运算符:is / is not

两个对象,是否指向同一个id。(id和内存地址还是有区别的)

1318010-20180303175041377-1960759569.png

注意区分"=="和"is":

==用来判断两个值是否相等,is是判断两个对象的id是否相同。

(二).逻辑运算符 not > and > or

1318010-20180303185248967-1721793812.png

四、哈希

hash(object)生成一个唯一的哈希值。

小技巧:这个内置函数,可以来判断一个对象是否是可变的。能生成哈希值的就是不可变对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wireshark 查看端口是否正常_网络抓包软件-Wireshark使用分享

Wireshark(以前叫Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是抓取网络封包,并尽可能地显示出详细的网络封包信息。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。基础界面介绍Wireshark软件界面有以下几个功能区域&#xf…

普通计算机用的是什么屏幕,笔记本屏幕的色域 72%NTSC和100%sRGB有什么区别

笔记本屏幕的色域 72%NTSC和100%sRGB有什么区别2018-09-15 11:00:05247点赞724收藏60评论无论是选购普通笔记本还是游戏本,大家除了关心产品的外观和配置外,越来越多的朋友把重点放在了屏幕上,也许TN屏和IPS屏大家很好判断哪个更好&#xff0…

redis源码分析 ppt_【Redis】redis各类型数据结构和底层实现源码分析

一、简介和应用Redis是一个由ANSI C语言编写,性能优秀、支持网络、可持久化的K-K内存数据库,并提供多种语言的API。它常用的类型主要是 String、List、Hash、Set、ZSet 这5种。Redis在互联网公司一般有以下应用:String:缓存、限流、计数器、分…

cv图像翻转_涨点技巧!汇集13个Kaggle图像分类项目的性能提升指南

从数据预处理、增强、模型优化、调参再到损失函数...本文转载自:AI公园作者:Prince Canuma 编译:ronghuaiyang注:文末附CV学习交流群导读覆盖了模型相关的方方面面,从数据准备到模型的推理,每个阶段的方法和…

miniui datagrid 隐藏列默认赋值_Qt商业组件DataGrid:内置视图和布局详解(一)

QtitanDataGrid是Qt的商业DataGrid组件,它为将表格数据呈现给最终用户提供了真正的非凡可能性。该组件吸收了用于显示表格的用户界面构造领域中的所有现代成就。目前,这是Qt市场上唯一具有如此令人印象深刻的高级功能和出色性能的网格组件。QtitanDataGr…

zookeeper中展示所有节点_分布式协调服务之Zookeeper

??理论篇一、基础概念ZooKeeper是开源分布式协调服务,提供高可用、高性能、稳定的分布式数据一致性解决方案,通常被用于实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。二、ZooKeep…

idea怎么给项目改名_微软改名部惹祸了

IT服务圈儿有温度、有态度的IT自媒体平台作者:局长本文经公众号:开源中国(oschina2013)授权转载,如需转载请联系出处几年前,微软发布了一个名为"GVFS"的项目,这是一个 Git 虚拟文件系统,全称为 G…

@postconstruct注解方法没有执行_被标记为事务的方法互相调用的坑(下)

上一节,主要分析了 被标记为事务的方法互相调用,事务失效的原因,思考比较多,这一节主要说说解决方案,思考会少一些。解决方案的核心: 通过代理对象去调用方法1.把方法放到不同的类:如果想学习Ja…

python argparse_Python 命令行之旅:argparse、docopt、click 和 fire 总结篇

本文首发于HelloGitHub公众号,并发表于Prodesire 博客。一、前言在近半年的 Python 命令行旅程中,我们依次学习了 argparse、docopt、click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变。 本文作为本次旅程的终点&am…

阻塞式和非阻塞式udp传输_NIO非阻塞网络编程三大核心理念

本次开始NIO网络编程,之前已经说过BIO,对于阻塞IO里面的问题一定有了清晰的认识,在JDK1.4版本后,提供了新的JAVA IO操作非阻塞API,用意替换JAVA IO 和JAVA NetWorking相关的API。NIO其实有个名称叫new IO。(一)NIO① 介…

如何查看服务器文件进程,如何查看服务器上的所有进程

如何查看服务器上的所有进程 内容精选换一换华为云SSL证书管理服务帮助中心,为用户提供产品简介、用户指南、常见问题等技术文档,帮助您快速上手使用云证书管理服务。分析辅助软件是一款支持部署到多台服务器目标环境上,实现对整个业务集群的…

python minimize_Python数学规划案例一

Python数学规划案例一问题、模型、数据、算法、结果,统一地表述,是习惯也是效率。我的公众号数学规划模型表述习惯采用五个部分:Set, Data, Variable, Objective, Constraints;每个Notation,采用一个主字符&#xff0c…

java map转string_【库学科技】32道常见的Java基础面试题

内容来源于图灵 侵删。什么是 Java 虚拟机(JVM)?为什么 Java 被称作是“平台无关的编程语言”?Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。Java 被设计成允许应用程序可以运行在任意的平…

cout输出字符串_leetcode C++题解系列-042 字符串相乘

题目给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 "2", num2 "3"输出: "6"示例 2:输入: num1 "123", num2 "456&quo…

python序列类型举例说明_Python(第八课,序列类型)

引言: 我们之前学过整数,浮点数,字符串,今天带来的更具有包容性。 今天带来的是高级数据类型,包括列表,元组,集合和字典。根据他们特性不同,可以分为序列类型,集合类型&a…

上传附件_留学落户|上传附件预审时一定一定要注意的问题!

点击上方蓝色字体,关注启铭君。www.minqifudao.com启铭君相信大家都知道,从2019年留学落户“一网通办”新系统上线,可以在网上进行材料申报,“让数据多走路,让群众少跑腿”。在新系统中填报资料,怎样才能做…

python斐波那契数列30_python的30个骚操作

1、冒泡排序2、计算x的n次方的方法3、计算a*a b*b c*c ……4、计算阶乘 n!5、列出当前目录下的所有文件和目录名6、把一个list中所有的字符串变成小写:7、输出某个路径下的所有文件和文件夹的路径8、输出某个路径及其子目录下的所有文件路径9、输出某个路径及其子…

python中值滤波介绍_Python 实现中值滤波、均值滤波的方法

红包:Lena椒盐噪声图片:# -*- coding: utf-8 -*- """ Created on Sat Oct 14 22:16:47 2017 author: Don """ from tkinter import * from skimage import io import numpy as np imio.imread(lena_sp.jpg, as_greyTrue) …

竖向图片插入_Word小技巧:让你的图片文字排版更有创意

想在头条中发表文章或者写论文,插入的图片太单调?今天小编就简单跟大家分享几个小技巧,图片搭配文字让你的版面更有可读性。第一种:最简单的横向文字排版具体做法:在word中插入图片后,插入一个文本框后输入…

11有没有压力感应_特殊感应器赋予机械手多维触感

最新研发的机械触感装备,已经不仅具有可伸展的韧性,还具有感知压力、形变和拉力的功能,将为软体机器人、虚拟现实(VR)和现实增强(AR)等设备带来革命性的巨变。美国康乃尔大学(Cornell University)工程学院副教授谢泼德(Rob Shepherd)说&#…