“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,settuple, list快了不止一点。所以说在数据量比较大的且需要查找元素的时候请使用dict, set,这样带来的速度提升不是一点点那么简单了

python 中in相关推荐

  1. 如何优雅的在python中暂停死循环?

    死循环 有时候在工作中可能会遇到要一直执行某个功能的程序,这时候死循环就派上用途了,python中死循环的具体形式大致如下 while True:run_your_code() 结束死循环 通常我们结 ...

  2. 关于python中的dict和defaultdict

    dict 在Python中如果访问字典中不存在的键,会引发KeyError异常,所以一般当我们比如统计一句话的词频时候,我们总是使用这样的处理方式: strings = ('puppy', 'kitt ...

  3. python中的新式类与旧式类的一些基于descriptor的概念(上)

    python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...

  4. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  5. Python中正则表达式用法 重点格式以这个为准_首看_各种问题

    20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...

  6. 逗号分隔的字符串转换为Python中的列表 split

    将逗号分隔的字符串转换为Python中的列表 给定一个字符串: 它是由逗号分隔的几个值的序列: mStr = '192.168.1.1,192.168.1.2,192.168.1.3' 如何将字符串转 ...

  7. [翻译]Python中yield的解释

    问题: Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 def node._get_child_candidates(self, distance, min_dist ...

  8. 全面理解Python中的类型提示(Type Hints)

    众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...

  9. python中break和continue的区别

    python中break和continue的区别 break 结束for 或者while 循环  后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...

  10. 通过带Flask的REST API在Python中部署PyTorch

    通过带Flask的REST API在Python中部署PyTorch 在本文中,将使用Flask来部署PyTorch模型,并用讲解用于模型推断的 REST API.特别是,将部署一个预训练的Dense ...

最新文章

  1. Codeforces 352B - Jeff and Periods
  2. C++一学就废?试试这个项目包
  3. java web如何配置ask_Javaweb新手之路之JavaWeb开发环境配置篇
  4. [arXiv18]更快的基于非二叉化自底向上策略的转移系统成分句法分析
  5. Django 路由系统
  6. Hexo + Github搭建自己的博客
  7. 史上最详细Sqlyog详细安装教程及使用
  8. 《Java从入门到放弃》框架入门篇:SpringBoot+mybatis搭建三层架构项目
  9. python脚本 文件夹内文件名转为拼音名
  10. ARM嵌入式系统的问题分析与总结
  11. CAD图形导入Altium Designer PCB主要事项
  12. html5 判断页面加载,js判断页面是否加载完成的方法
  13. 云计算概念的基本介绍,云计算的特点主要有哪些?
  14. C# Halcon 图像放大缩小代码
  15. 服务器cadence比虚拟机慢,Cadence版本选择浅见
  16. [Leetcode] 643. 子数组最大平均数 I java
  17. 西南大学844信号与系统考研经验(高分上岸学姐)
  18. Navicat操作MySQL简易教程
  19. 构建智慧城市管理体系,京东方智慧物联平台赋能细分场景
  20. 诊断服务之0x10(DiagnosticSessionControl)

热门文章

  1. .NET Core 新手上路
  2. 针对宝塔面板一个站点多个域名使用SSL证书的解决方案
  3. 某程序员自述:我,三十多岁,逃离北上广,通过技术移民到加拿大!
  4. aso优化时高权重的积分墙关键词_怎样做好积分墙关键词的优化
  5. Postfix权威指南阅读笔记
  6. NTKO控件安装失败解决方式
  7. 怎么理解函数式编程?
  8. 计算机的硬盘容量可以调,怎么查看电脑硬盘容量_怎么查看电脑内存大小
  9. iOS XCode storyboard 设置控件三等分屏幕的约束添加
  10. 卢旺达饭店插曲--Million Voices