Python 深入理解dict---为什么 dict 查询元素比 list 快?

Python TypeError: unhashable type: ‘dict‘ 的深度解析与三种实战解决方案 本文深度解析Python中常见的TypeError: unhashable type: 'dict'错误,揭示字典不能作为字典键的根本原因,并提供三种实战解决方案:JSON字符串转换、frozenset冻结字典项和元组转换。针对不同场景详细分析各方案的优缺点,帮助开发者高效处理字典哈希问题,提升代码质量与性能。 阅读详情

前言:

查看 https://wiki.python.org/moin/TimeComplexity 中的数据可以看到

在 list 中查找元素的复杂度为 O(n) , 在 dict 中查找元素的复杂度 为 O(1)

本文来探讨以下其中的原理。

1. hash

字典建立在另一种技术之上:哈希表

hash 函数是一种可以将任意长度的数据映射到固定长度值的函数,称为哈希。

hash 函数有 3 大特点:

  • 速度快:
  • 确定性: 同一数据hash计算后,永远产生唯一的确定值。
  • 固定长度:无论输入多大的数据, 输出永远是一个固定的预定长度

hash 函数通常是单向函数:您可以从字符串中获取哈希散列,但无法从哈希散列中获取原始字符串。常见哈希算法有 MD5、SHA-1、SHA-2、NTLM

1.1 python 中的 hash 函数

Python 有一个内置函数来生成对象的哈希值,hash() 函数。该函数将一个对象作为输入,并返回int 类型的哈希值。

In [1]: hash('abc')
Out[1]: -3391815365988244928
In [2]: hash('dsjfkueriwufjasklklxcnvmsjaflkjoeurioeafklajfklasdklghksadhduiweyrioahfkasgkhakryaeiorhklaghkadshgkjahglkahtuehakjgfakjhgjkahgkjahjgkasdhjkncnmajkfahdkfhqieyrahfaklhoieior92374972398akjfhajk19207ashkdhfkjahgdklafiaufiou39274quriefiahrypi3q2i7prq')
Out[2]: -2151681143199748630

In [3]: hash(100.01)
Out[3]: 23058430092148836
In [4]: hash(23058430092148836)
Out[4]: 23058430092148836

通过以上代码可以看到,输入数据的长度为很短的 'abc' 和 很长的字符串,hash 返回的结果都是一样长的数据。

另外,可以发现 hash(100.01) 和 hash(23058430092148836) 返回的值是相同的。

这是完全正常的,因为如果哈希任何数字或任何字符串以获得固定长度值,因为不能由固定长度值表示的无限值,也就是说必然会有重复的值。它们被称为碰撞,当两个对象具有相同的哈希值时,就说它们发生了碰撞。

1.2 python 中的可 hash 数据类型

默认情况下,只有不可变类型在 Python 中是可 hash 的。如果您使用的是不可变的容器(tuple),那么tuple 内的内容也应该是不可变的,数据整体是可 hash 的。因为 dict 构建在 哈希表之上, 所以要求 字典的key必须是可 hash 的。当我们尝试将 不可哈希的数据赋值给字典的key时 会引发 TypeError

In [1]: dict_a = {}
In [2]: dict_a['key'] = 'value'
In [3]: dict_a[('tuple', 'taple')] = 'tuple key'

In [4]: dict_a[[1, 2, 3]] = 'invalid key'
---------------------------------------------------------------------------
TypeError: unhashable type: 'list'

2. 哈希表

哈希表是一种允许您存储键值对集合的数据结构。存储的键值对通过使用其键的哈希来索引,所以查找表元素所需的平均指令数与存储在表本身中的元素数无关。

哈希表通常是通过创建可变数量的存储桶来实现,这些桶将包含您的数据 value,并通过对它们的键进行哈希来索引这些数据。键的哈希值将确定用于该特定数据的正确存储桶。

2.1 hash表索引

2.1.1 列表-线性扫描

列表中检查 是否存在元素代码  33 in [3, 47, 18, 52, 15, 9, 33, 20] ,执行过程如下图, 需要遍历扫描每一个位置的数据, 最坏情况下,要扫描整个列表才返回 False, 所以列表查找元素的复杂度为 O(n)

 2.1.2 hash表-单独链接

单独链接方式的hash表,使用一个嵌套列表,存储对象的hash值作为索引坐标, 将value放到列表中。 查找特定值时必须完全扫描嵌套列表中的数据。

为了方便, 使用一个简单的 hash 函数, 对原列表求值。 

In [1]: def hash(n):
   ...:     return n

In [2]: for i in [3, 47, 18, 52, 15, 9, 33, 20]:
   ...:     print(f'data {i}\t index {hash(i)%8}')
data 3   index 3
data 47  index 7
data 18  index 2
data 52  index 4
data 15  index 7
data 9   index 1
data 33  index 1
data 20  index 4

[3, 47, 18, 52, 15, 9, 33, 20] 列表存储到 hash 表中的结果如下图所示,依次对数据求hash然后对列表长度取余数,然后存储到对应位置,若当前位置已经有值,则存储到嵌套列表后面。 

 查找元素的过程, 对数据求hash之后,找到对应的索引,然后遍历嵌套列表即可。查找元素的复杂度 为 O(1)

 

 

  2.1.3 ⭐ hash表-开放寻址 

在开放寻址策略的hash表,如果当前的桶被占用,只需向后继续搜索要使用的新桶。如果我们使新列表与原始列表的大小相同,则会发生太多冲突, 本例子中使用1.5倍, 长度为12

In [3]: for i in [3, 47, 18, 52, 15, 9, 33, 20]:
   ...:     print(f'data {i}\t index {hash(i)%12}')
data 3   index 3
data 47  index 11
data 18  index 6
data 52  index 4
data 15  index 3
data 9   index 9
data 33  index 9
data 20  index 8

[3, 47, 18, 52, 15, 9, 33, 20] 列表存储到 hash 表中的结果如下图所示,依次对数据求hash然后对列表长度取余数,然后存储到对应位置,若当前位置已经有值,则向后查找第一个空槽存储。

如下图所示, 元素15 目标位置为索引3,但是索引3 已经有了值,所以15就向后查找第一个空槽存到了索引4,(如果后续还有索引为3的数据,将被存到索引7的位置)

 查找元素的过程, 对数据求hash之后,找到对应的索引,若当前元素的值不是所求的值,则继续向后遍历,直到遍历到None, 返回 False。

开放寻址策略的主要问题是,如果您还必须处理表中元素的删除,则需要执行逻辑删除而不是物理删除,因为如果删除在冲突期间占用桶的值,另一个永远不会找到碰撞的元素。

如上图, 如果删掉了元素9,33 也将无法访问

 

 3. python的dict

Python中dict 实现是一个开放寻址模式的hash表。

In [8]: import sys

In [9]: dict_a = {}

In [10]: for i in range(20):
    ...:     dict_a[i] = 100
    ...:     print(f"elements = {i+1} size = {sys.getsizeof(dict_a)}")
    ...:
elements = 1 size = 240
elements = 2 size = 240
elements = 3 size = 240
elements = 4 size = 240
elements = 5 size = 240
elements = 6 size = 368
elements = 7 size = 368
elements = 8 size = 368
elements = 9 size = 368
elements = 10 size = 368
elements = 11 size = 648
elements = 12 size = 648
elements = 13 size = 648
elements = 14 size = 648
elements = 15 size = 648
elements = 16 size = 648
elements = 17 size = 648
elements = 18 size = 648
elements = 19 size = 648
elements = 20 size = 648

 如代码所见,在插入第六个和第十一个元素后,dict 增长了,但为什么呢?因为为了使我们的 Python 哈希表快速并减少冲突,解释器会在字典变满三分之二时不断调整大小。

然后我们删除字典中的所有元素

In [11]: keys = list(dict_a.keys())

In [12]: for key in keys:
    ...:     del dict_a[key]

In [13]: dict_a
Out[13]: {}

In [14]: sys.getsizeof(dict_a)
Out[14]: 648

 会发现即使字典为空,空间也没有被释放。

但是,如果您通过调用 clear() 方法清空字典,由于它是批量删除,空间将被释放并达到其最小值 72 字节:

In [15]: dict_a.clear()

In [16]: sys.getsizeof(dict_a)
Out[16]: 72

 总结

dict 的底层实现是哈希表, 特点是占用内存多,用空间换取速度。

删除数据时,是逻辑删除,并不会释放对应的内存

Python中级进阶:深入理解对象生命周期与核心协议 Python作为一门动态语言,其运行时行为远不止语法表层所示。理解对象生命周期、名称空间解析机制和各类核心协议(如迭代器、描述符、上下文管理器),是突破‘能写但不懂为何这样执行’认知瓶颈的关键。这些底层机制决定了内存是否泄漏、多线程是否安全、装饰器为何失效、生成器为何不可重复遍历等高频工程问题。掌握字节码层面的执行逻辑(如IS_OP vs COMPARE_OP、LIST_APPEND优化)与生产级实践模式(如用contextlib替代__del__、weakref破除循环引用),才能真正驾驭中大型项目中的稳 阅读详情

相关推荐

Python 中list ,set,dict的大规模查找效率对比详解

主要介绍了Python 中list ,set,dict的大规模查找效率对比详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

为什么[]比list()快?

I recently compared the processing speeds of [] and list() and was surprised to discover that [] ru

xfxf996的博客 317

从零搭建UVM验证环境:新手入门实践指南

在数字芯片验证领域,SystemVerilog和UVM(Universal Verification Methodology)是构建高效验证环境的核心技术。其原理基于面向对象编程和事务级建模,通过组件化架构实现验证的复用性和自动化。这一方法学的技术价值在于显著提升验证效率与质量,广泛应用于处理器、通信芯片等复杂设计的验证场景。本文聚焦于UVM验证环境的搭建实践,通过一个加法器实例,详细解析了uvm_driver、uvm_monitor、uvm_sequence等关键组件的协同工作机制,并提供了基于Quest

weixin_30015371的博客 446

dict用来存储长数组读取速度远快于list

可以用list存储也可以用dict存储: 我想知道,list读一个值返回索引和dict读一个索引哪个快? >>> c=range(100000) graph={} >>> time1=time.time() print c.index(99999) time2=time.time() print time2-time1 99999 0.000999927520752 >>> for i in range(l

lxhseph的博客 169

记一次Nacos线程数飙升排查

Nacos线程飙升问题排查

叭嘣的博客 2632

Codex登录要手机验证码?Cockpit Tools跳过验证保姆级教程

摘要:OpenAI升级风控后,Codex登录需手机验证,增加批量账号使用成本。CockpitTools(GitHub 8.3k star)可绕过验证,支持多AI编程平台账号管理。操作步骤:1) 获取ChatGPT网页Session数据;2) 通过转换工具生成CPA格式JSON;3) 导入工具启动Codex。注意:仅适用于未绑定手机号的账号,Session会过期,且需防范数据泄露风险。商业账号通常直接提供认证文件。(150字)

5864

剑指 Offer 03. 数组中重复的数字java

找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof 著作权归领扣网络所有。商业转载请联系官方

weixin_43824233的博客 428

Unity Android平台下插件/SDK开发通用流程

本文主要面向对Android开发不甚了解的Unity开发者,介绍了基于最新的Android Studio的标准Android开发环境与项目结构的配置流程,在此基础上,开发者可以快速的进行SDK的接入与插件的开发。

ZhangDi2017的博客 1万+

python 字典查询比列表快_Python:哪个更快:匹配列表还是匹配字典?

就速度而言,你可能想利用字典。似乎不管怎样,您都需要遍历一个列表。字典当然比迭代列表快,所以你至少可以把一个列表变成dict(我测试了下面的解决方案,在两个单独的列表中有200000个条目,我的平均速度是0.109999秒。如果你只是尝试使用列表或元组,你可能不会接近这个目标,除非你的条目顺序允许你使用类似zip的东西。您的序列号似乎是唯一的,因此下面的方法是可行的(通过迭代一个列表,然后将第1、...

weixin_39948111的博客 1125

ArcGIS Pro 3.4 二次开发 - 布局

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作布局工程项的相关方法。主要内容包括:引用布局工程项和关联布局,在新视图中打开或激活已有布局视图,引用活动布局视图,导入/移除布局工程项,创建基本布局或带参考线的自定义布局,修改布局页面尺寸,以及创建圆形图形元素等操作。重点演示了如何通过CIM(Core Infrastructure Model)进行高级布局配置,并详细说明了圆形图形元素的创建过程,包括几何构建、符号设置和图形生成。所有涉及UI线程的操作都遵循ArcGIS Pro SDK

Winemonk 795

168、OIS光学防抖系统设计:陀螺仪标定、音圈马达驱动与滚珠式/悬丝式结构选型

本文总结了OIS光学防抖系统设计中的关键问题与解决方案。作者通过实际案例指出,陀螺仪标定需重视零偏、灵敏度和温度补偿问题,音圈马达驱动需采用电流环控制并优化相位补偿。在机械结构选型方面,滚珠式适合大角度补偿但存在回差问题,悬丝式精度高但受重力影响,需根据应用场景选择。系统联调建议从开环到闭环逐步验证,注意陀螺仪与驱动频率匹配。最后给出5条经验建议:关注陀螺仪信噪比而非分辨率、预留标定余量、重视机械结构公差、配备专业调试工具、协调OIS与电子防抖的分工配合。文章强调OIS调试需针对不同模组特性进行反复测试与标

zzfmlxs的博客 46

set、dict、dict.keys、list性能大PK

性能

ningyanggege的博客 254

综述性论文别再堆砌文献!用GPT-5.1 Thinking轻松攻克四大关键难点,真正实现高效高质撰写(附AI提示词)

逻辑构建上以往都是先梳理一篇文献的领域研究脉络,明确其发展阶段、核心议题等,再搭建初步的大纲,借助思维导图或者别的方式将筛选后的文献观点按主题归类到对应章节,理清楚每个章节间的递进或并列关系,最后再逐个章节进行补充过渡表述,那么做的目的其实就是摆脱文献堆砌问题。人工做法往往是对比不同文献的研究方法、数据来源与核心结论,再清晰标注每类成果的优缺点,找到文献中存在的争议焦点,找到之后再梳理争议产生的核心原因,最后在基于现有研究,推出还未被探索的研究方向,从而提炼出创新切入点。2)文献之间的相同点与不同点;

智能AI让学术科研更容易 174

Python核心数据类型:深入理解6种原子类型与dict枢纽作用

Python数据类型是程序运行的基石,其本质并非语法标签,而是内存布局、协议实现与运行时契约的统一。从int的任意精度、float的IEEE 754约束、str的Unicode语义,到bool作为int子类的隐式转换、NoneType的单例权威、tuple的不可变契约,每种类型都承载特定数学与工程假设。dict则作为枢纽型结构,支撑命名空间、哈希查找与对象调度,其可哈希性要求直指str、int、tuple等原子类型的底层实现。理解这些类型,是解决TypeError、KeyError、JSON序列化失败及pa

weixin_34204722的博客 313

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

第三章 python基础 数据结构(list、set、tuple、dict、string五大数据类型)

简单分析列表、元组、字典、集合 python基础

weixin_51996883的博客 879

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

list、set、tuple、dict适用场景对比

Python内置的四大核心数据结构——list(列表)、set(集合)、tuple(元组)和dict(字典),各具独特特性和适用场景。掌握它们的本质差异和实战应用,不仅能帮助开发者写出高效、健壮的代码,更能在软件测试、系统运维等领域实现智能化数据管理和精准分析。 本文将结合理论与实践,系统对比这四种数据结构的设计初衷、行为特点和典型使用场景,帮助读者深入理解并科学选择适合的容器,开拓编程思路。

测试者家园 1479

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

10种 Python数据结构,从入门到精通

作者:郭震简介在这个专题中,我们将通过精简的文字和典型案例,盘点Python常用的数据结构。对于Python初学者来说,只需掌握list、tuple、set、dict等基本数据结构,做到灵活运用即可。然而,随着学习的深入,遇到的实际场景会变得复杂,此时了解Python内置的更强大数据结构,如deque、heapq、Counter、OrderedDict、defaultdict、ChainMap,将...

相信相信的力量 1024

Python入门——四大容器解析

四大容器解析 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 在Python中,有四大数据结构:列表List、元组Tuple、集合Set、字典Dict 因为软件需要大量的代码去解决需求,简单的代码不一定能解决问题,四大数据结构的结合调用可以完成需要的功能。 一.列表 List 1.什么是列表? 是一种线性表,结构为线性结构。由大量的节点组成,每一个节点都能存储大量的数据。 2.语法结...

Sirius的博客 2229

Python基础(10) 序列(tuple/list)、字典(dict)、集合(set)

文章目录1. 序列1.1. 序列1.2. 列表1.3. 元组2. 字典2.1. 普通 dict 类的使用 1. 序列 包括list/tuple等。 有一些操作是所有序列都共有的。 1.1. 序列 个人理解:本质就是数组,可以通过索引来获取(部分类型可以修改)元素。 索引操作: 数组编号,可以为负数,如-1就是最后一个元素。 分片:通过索引来访问一定范围内的元素,形如[start:end:step] 索引范围包括start,不包括end。 步长不能是0,但可以是负数。 如果start >= e

清欢 426

【python专题】数据集合

python基础之数据集合

永春的优快云博客 1万+

深入理解Python Set:从集合运算到底层哈希表与性能优化

在Python数据处理中,数据结构的选择直接影响代码效率与可维护性。Set作为内置集合类型,以哈希表为基础,提供O(1)复杂度的成员检测与去重能力,成为解决重复、交叉比对等问题的利器。本文从集合的基本概念出发,讲解Set与数学集合的关系,剖析哈希表底层机制,并通过list对比实测展示性能差异。同时结合数据清洗、权限校验、标签比对等实际场景,给出选型建议与常见坑点,帮助开发者合理运用Set优化业务逻辑。

weixin_34098209的博客 121

深入理解Python字典与集合:从哈希表原理到性能优化实战

哈希表是计算机科学中一种以键值对为核心的基础数据结构,它通过哈希函数将数据映射到存储位置,实现接近O(1)的查找、插入与删除。在Python中,字典(dict)和集合(set)正是哈希表的典型实现,分别用于键值映射与成员去重。理解哈希表原理,不仅有助于解释列表与集合在成员判断上的巨大性能差异,还能指导我们在日志分析、列表比对、分类统计等高频场景中设计更高效的数据处理流程。例如,用Python字典代替列表做计数统计,用集合做交并差运算和IP去重,可将千万级日志处理从小时级缩短到秒级。围绕哈希表本质,系统梳理P

weixin_29611239的博客 200

python基本类型介绍

之前一直觉得语言这东西,只要懂点语法,会用就行。然而昨天百度的面试,让我对此有了新的认识。可以不用过多关注语言本身,但是基本原理(思想)是一定要懂得,只有这样才能写出高效的代码。于是打算写一篇博客来深入理解下python常见的几种数据类型。 python的基本数据类型有Number(数字)、String(字符串)、Tuple(元组)、List(列表)、Dictionary(字典)、Set(集合)...

JingYi的专栏 7117

python列表字典操作_python中列表,元组,字典常用操作方法的总结

如有不足之处,请评论批评指正# 1. 列表的常用操作(增,删,改,查)list1 = [0, 1, 2, 3, 4, 5 ]list2 = ["a", "b", "c", "d"]list3 = ["a", "b", "c"]list1.append(100) # 将指定值添加到列表的尾部print(list1)list1.insert(4, 88) # 指定位置插入指定值p...

weixin_33476081的博客 323
上一篇: Python中的内存管理---list的内存使用
下一篇: Python 并发编程(一)基本概念(进程、线程、协程)
be5yond
博客等级 码龄10年 590粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值