python 中in
“in”的存在使得python在操作可迭代对象时简单得多,这便是“in”存在的一个最大的好处
1.用于判断(查找)元素是否在可迭代对象中(不包括生成器;但包括set集合,set不能迭代,但是也能用“in”来查找元素):
xxx in XXX :判断xxx是否在XXX中, 如果在,返回真,不在,返回假。
xxx not in XXX :判断xxx是否不在XXX中, 如果不在,返回真,在,返回假。
可配合“if”和“while”使用:
if x in X
if x not in X
while x in X
while x not in X
2.用于逐个取可迭代对象的元素, 一般要配合for使用:
我们可能常用到的可迭代的对象包括:string, list, dict, tuple, generator, range函数
例子:
list_1 = [n for n in range(10)]
for i in list:print(i)
3.在前面1的条件下,“in”的效率在不同的对象中查找元素效率是很不一样的。
tuple, list, dict, set用“in”来查找元素时效率是相差很大的。
主要是因为dict, set背后原理是一个散列表。而tuple, list只是一个单纯类似与数组的结构
那什么是散列表?
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
关于散列表的原理我就不在这里细讲,总之就是一种算法来使表中的每个元素附上一个键(key),然后查找元素只要匹配这个键来就可以了。速度上会快很多。如果有兴趣可以点这篇链接了解:哈希表(散列表)原理详解
下面我举个例子感受下:
import time
import randomLEN = 10 ** 7# 生成各不相同的10^7个元素
in_set = {random.random()for i in range(LEN)}
while len(in_set) < LEN:in_set.add(random.random())# 转换为list,tuple,dict
in_list = list(in_set)
in_tuple = list(in_set)
in_dict = {key: 0 for key in in_set}#随机选择其中500个用于查找
needles = [in_list[random.randint(0, LEN)]for _ in range(500)]def test(target):t1 = time.time()global needlesfound = 0for n in needles:if n in target:found +=1t2 = time.time()print(found)return t2 - t1t1 = test(in_set)
t2 = test(in_list)
t3 = test(in_tuple)
t4 = test(in_dict)
print(t1, t2, t3, t4)
结果:set:0.0009999275207519531, list:451.28881216049194,tuple:464.02254033088684, dict:0.0010001659393310547
dict,set比tuple, list快了不止一点。所以说在数据量比较大的且需要查找元素的时候请使用dict, set,这样带来的速度提升不是一点点那么简单了
python 中in相关推荐
- 如何优雅的在python中暂停死循环?
死循环 有时候在工作中可能会遇到要一直执行某个功能的程序,这时候死循环就派上用途了,python中死循环的具体形式大致如下 while True:run_your_code() 结束死循环 通常我们结 ...
- 关于python中的dict和defaultdict
dict 在Python中如果访问字典中不存在的键,会引发KeyError异常,所以一般当我们比如统计一句话的词频时候,我们总是使用这样的处理方式: strings = ('puppy', 'kitt ...
- python中的新式类与旧式类的一些基于descriptor的概念(上)
python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...
- Python中yield和yield from的用法
yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...
- Python中正则表达式用法 重点格式以这个为准_首看_各种问题
20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...
- 逗号分隔的字符串转换为Python中的列表 split
将逗号分隔的字符串转换为Python中的列表 给定一个字符串: 它是由逗号分隔的几个值的序列: mStr = '192.168.1.1,192.168.1.2,192.168.1.3' 如何将字符串转 ...
- [翻译]Python中yield的解释
问题: Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 def node._get_child_candidates(self, distance, min_dist ...
- 全面理解Python中的类型提示(Type Hints)
众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...
- python中break和continue的区别
python中break和continue的区别 break 结束for 或者while 循环 后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...
- 通过带Flask的REST API在Python中部署PyTorch
通过带Flask的REST API在Python中部署PyTorch 在本文中,将使用Flask来部署PyTorch模型,并用讲解用于模型推断的 REST API.特别是,将部署一个预训练的Dense ...
最新文章
- Codeforces 352B - Jeff and Periods
- C++一学就废?试试这个项目包
- java web如何配置ask_Javaweb新手之路之JavaWeb开发环境配置篇
- [arXiv18]更快的基于非二叉化自底向上策略的转移系统成分句法分析
- Django 路由系统
- Hexo + Github搭建自己的博客
- 史上最详细Sqlyog详细安装教程及使用
- 《Java从入门到放弃》框架入门篇:SpringBoot+mybatis搭建三层架构项目
- python脚本 文件夹内文件名转为拼音名
- ARM嵌入式系统的问题分析与总结
- CAD图形导入Altium Designer PCB主要事项
- html5 判断页面加载,js判断页面是否加载完成的方法
- 云计算概念的基本介绍,云计算的特点主要有哪些?
- C# Halcon 图像放大缩小代码
- 服务器cadence比虚拟机慢,Cadence版本选择浅见
- [Leetcode] 643. 子数组最大平均数 I java
- 西南大学844信号与系统考研经验(高分上岸学姐)
- Navicat操作MySQL简易教程
- 构建智慧城市管理体系,京东方智慧物联平台赋能细分场景
- 诊断服务之0x10(DiagnosticSessionControl)