算法笔记--哈希表

news2024/11/16 15:49:14

创建和使用Python字典(哈希表)

在Python中,哈希表通常是通过字典(dict)来实现的。

字典是一种可变容器模型,可以存储任意类型的对象,如字符串、数字、元组等其他容器模型。

字典的每个键值对(key-value pair)用冒号(:)分隔,每个对之间用逗号(,)分隔,整个字典包括在花括号({})中。

字典是Python中实现哈希表的主要方式

# 创建一个空字典  
my_dict = {}  
  
# 创建一个带有一些键值对的字典  
my_dict = {  
    'name': 'John',  
    'age': 30,  
    'city': 'New York'  
}  
  
# 访问字典中的元素  
print(my_dict['name'])  # 输出: John  
  
# 添加一个新的键值对  
my_dict['gender'] = 'Male'  
  
# 更新一个已存在的键值对  
my_dict['age'] = 31  
  
# 删除一个键值对  
del my_dict['city']  
  
# 遍历字典的键值对  
for key, value in my_dict.items():  
    print(f"{key}: {value}")  
  
# 遍历字典的键  
for key in my_dict.keys():  
    print(key)  
  
# 遍历字典的值  
for value in my_dict.values():  
    print(value)

enumerate函数

enumerate 是 Python 中的一个内置函数,它用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,通常用在 for 循环当中。

使用 enumerate 可以同时获得每个元素的索引和值,这在处理需要索引的场景下非常有用。

enumerate(iterable, start=0)
  • iterable:一个序列、迭代器或其他支持迭代的对象。
  • start:下标起始位置,默认为 0。

返回值:

enumerate 返回一个枚举对象,该对象包含每个元素的索引和值。

示例:

seasons = ['Spring', 'Summer', 'Fall', 'Winter']  
  
# 使用 enumerate 获取索引和值  
for index, season in enumerate(seasons):  
    print(f"Index: {index}, Season: {season}")  
  
# 输出  
# Index: 0, Season: Spring  
# Index: 1, Season: Summer  
# Index: 2, Season: Fall  
# Index: 3, Season: Winter

使用场景

  • 在循环中使用元素的索引时。
  • 同时访问数据及其索引时。
  • 在循环中跟踪迭代次数时。

同时使用 enumerate 和哈希表

在遍历列表的来记录每个元素的出现次数:

# 定义一个列表  
nums = [1, 2, 3, 2, 4, 3, 5]  
  
# 初始化一个哈希表来记录每个元素的出现次数  
count_dict = {}  
  
# 使用 enumerate 遍历列表  
for index, num in enumerate(nums):  
    # 如果元素已经在哈希表中,则增加其计数  
    if num in count_dict:  
        count_dict[num] += 1  
    # 否则,将元素添加到哈希表中,并设置计数为 1  
    else:  
        count_dict[num] = 1  
  
# 打印结果  
print(count_dict)

# {1: 1, 2: 2, 3: 2, 4: 1, 5: 1}

力扣题目-两数之和

1. 两数之和 - 力扣(LeetCode)

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        # 初始化了一个空的哈希表(字典),用于存储遍历过的数字及其索引
        hashtable = dict()
        # 使用enumerate函数遍历nums列表,同时获取每个元素的索引i和值num
        for i, num in enumerate(nums):
            if target - num in hashtable:
                # 如果找到了满足条件的两个数,就返回它们的索引。hashtable[target - num]是之前遍历到的与当前数num相加等于target的数的索引,i是当前数的索引。
                return [hashtable[target - num], i]
            # 如果当前遍历的数num与之前的任何数的和都不等于target,就将这个数及其索引添加到哈希表中,以便后续的检查
            hashtable[nums[i]] = i
        # 如果遍历完整个数组都没有找到满足条件的两个数,就返回一个空列表。
        return []

力扣题目-好数对的数目

1512. 好数对的数目 - 力扣(LeetCode)

给你一个整数数组 nums 。

如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。

返回好数对的数目。

class Solution:
    def numIdenticalPairs(self, nums: List[int]) -> int:
       
        m = collections.Counter(nums)
        sum = 0
        for k, v in m.items():
            sum = sum + v*(v-1)//2
        return sum

1. collections.Counter(nums) 是 Python 中的一个非常有用的功能,它位于 collections 模块下。Counter 类用于计数可哈希对象。当你将一个可迭代对象(比如列表、元组、字符串等)传递给 Counter 时,它会返回一个字典的子类,该字典的键是原始可迭代对象中的元素,值是该元素在原始对象中出现的次数。

这个特性在处理数据分析和统计时特别有用,因为它可以快速地告诉我们每个元素出现的频率。
2. 用哈希表统计每个数在序列中出现的次数,假设数字 k 在序列中出现的次数为 v,那么满足题目中所说的 nums[i]=nums[j]=k(i<j) 的 (i,j) 的数量就是 v*(v-1)/2

获取当前时间

import time  # 导入time模块  
  
# 使用time.strftime和time.localtime来获取并格式化当前时间
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) ,' xxxx')

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

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

相关文章

GAT知识总结

《GRAPH ATTENTION NETWORKS》 解决GNN聚合邻居节点的时候没有考虑到不同的邻居节点重要性不同的问题&#xff0c;GAT借鉴了Transformer的idea&#xff0c;引入masked self-attention机制&#xff0c; 在计算图中的每个节点的表示的时候&#xff0c;会根据邻居节点特征的不同来…

【文生视频系列】MoneyPrinterTurbo项目初探

1. 背景介绍 一直有在关注文生视频方面的进展信息。比较知名的可能还是sora这类文生视频模型。但今天要讲的是另外的文生视频项目&#xff0c;也是偶然间在git上看到的&#xff0c;项目名称叫MoneyPrinterTurbo&#xff0c;是基于MoneyPrinter项目增加了中文支持&#xff0c…

R语言统计分析——自编函数

参考资料&#xff1a;R语言统计分析【第2版】 一个函数的结构大致如此&#xff1a; myfunction<-function(arg1,arg2,...){ statements return(object) } 函数中的对象只在函数内部使用。返回对象的数据类型是任意的。 假设我们要编写一个函数&#xff0c;用来计算数据对象…

【C++BFS算法 二分查找】2812. 找出最安全路径

本文涉及知识点 CBFS算法 C二分查找 LeetCode2812. 找出最安全路径 给你一个下标从 0 开始、大小为 n x n 的二维矩阵 grid &#xff0c;其中 (r, c) 表示&#xff1a; 如果 grid[r][c] 1 &#xff0c;则表示一个存在小偷的单元格 如果 grid[r][c] 0 &#xff0c;则表示一…

【C语言篇】C语言常见概念

文章目录 C语言常见概念C语言是什么C语⾔的历史和辉煌编译器选择编译和连接编译器对比 第一段C语言代码main函数库函数关键字介绍字符和ASCII编码转义字符语句空语句表达式语句函数调⽤语句复合语句控制语句 注释两种形式/* */的形式//形式注释会被替换注释会被替换 C语言常见概…

关键路径算法(Critical Path)

这个算法《算法导论》中并没有提及&#xff0c;很多书和博客说的有点奇怪&#xff0c;所以写本文作为笔记。 关键路径是什么 关键路径的定义非常简单&#xff1a;就是一个图中&#xff0c;权值之和最大的路径就是关键路径。 那么就可以知道关键路径不唯一。 为什么有关键路…

让大脑处于顶峰的14个保养技巧

让大脑处于顶峰的14个保养技巧 阅读。 之所以第一个写阅读&#xff0c;是因为阅读需要大脑将已认知的信息与新接触信息结合从而更容易激发人的想象力&#xff0c;而图片与视频虽然更直观&#xff0c;但理解和思考的过程却缩短了&#xff0c;大脑得到的锻炼也十分局限。阅读是让…

Typesript的type和interface的异同?

详解TypeScript中type与interface的区别_javascript技巧_脚本之家 一、相同的地方 1、都可以用来定义对象&#xff0c;描述函数 我们在用typescript开发的时候经常要用到数据类型定义&#xff0c;比如我们写一个接口或者函数的时候定义传参数据类型及字段等。这样子方便知道这…

opencascade AIS_PointCloud源码学习

AIS_PointCloud 前言 交互对象用于一组点。 表示支持两种显示模式&#xff1a; 点。 用于高亮显示的边界框。 表示通过边界框提供选择。 选择和高亮显示可以通过将默认选择模式设置为 -1 来禁用。 这样在交互视图中将无法选择对象。任何调用 AIS_InteractiveContext::AddOrRem…

Lua编程

文章目录 概述lua数据类型元表注意 闭包表现 实现 lua/c 接口编程skynet中调用层次虚拟栈C闭包注册表userdatalightuserdata 小结 概述 这次是skynet&#xff0c;需要一些lua/c相关的。写一篇博客&#xff0c;记录下。希望有所收获。 lua数据类型 boolean , number , string…

【一图学技术】2.API测试9种方法图解

9种API测试方法 冒烟测试&#xff1a;冒烟测试是一种快速的表面级测试&#xff0c;用于验证软件的基本功能是否正常工作&#xff0c;以确定是否值得进行更详细的测试。功能测试&#xff1a;功能测试是验证软件是否符合预期功能要求的测试类型。它涉及对每个功能进行测试&#…

[C++进阶]对于多态的底层逻辑

上回我们了解到了多态的定义,概念以及实现,对于多态如何使用和使用条件进行了了解,本篇我们将了解多态的原理。 一、虚函数表 首先我们看看如下代码&#xff1a; #include<iostream> using namespace std; class Base { public:virtual void Func1(){cout << &qu…

动手学深度学习V2每日笔记(权重衰退+Dropout)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1UK4y1o7dy/vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录&#xff0c;内容不会特别严谨仅供参考。 1.函数目录…

百某应JS逆向

https://ying.baichuan-ai.com/ 目录 一、发起提问 二、观察发现有两个加密参数&#xff1a;X-Bc-Sig和X-Bc-Ts ​三、观察JS调用栈 四、从JS中搜索 X-Bc-Sig和X-Bc-Ts 五、断点并分析参数的生成方式 六、分析入参 七、发现关键的o方法调用了一个i()方法 八、验证结果 …

sqlilabs解题方法

Lass1 查询id为1的用户名和密码 查询id为2的用户名和密码 没有回显&#xff0c;不含id-1的行 判断字段数&#xff0c;字段数为3 查询数据库用户名&#xff0c;和数据库名 查询时id必须超出数据库以外&#xff0c;一般用-1 用户名&#xff1a;user() 数据库名&#xff1a;databa…

VulnHub:colddbox easy

靶机下载地址 信息收集 主机发现 攻击机网段192.168.31.0/24&#xff0c;扫描同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 发现靶机&#xff0c;IP为192.168.31.176。 端口扫描 扫描靶机开放端口。 nmap 192.168.31.176 -A -p- -T4 开放了80,4512端口&#xff0c;注…

[H并查集] lc100347. 判断矩形的两个角落是否可达(并查集+高质量+周赛408_4)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;100347. 判断矩形的两个角落是否可达 参考&#xff1a; 灵神视频题解&#xff1a;筛质数 巧妙枚举 并查集【力扣周赛 408】 这一期周赛很不错。 2. 题目解析 十分不错的题目哈&#xff0c;关键是题意的转换…

哈希 Hash(闭散列、开散列介绍及其实现)

目录 unordered 系列关联式容器unordered_mapunordered_map 的介绍unordered_map 的接口说明构造函数容量函数迭代器元素访问查询操作修改操作桶操作 unordered_setunordered_set 的介绍unordered_set 的接口说明构造函数容量函数迭代器查询操作修改操作桶操作 底层结构哈希概念…

Catalyst优化器:让你的Spark SQL查询提速10倍

目录 1 逻辑优化阶段 2.1 逻辑计划解析 2.2 逻辑计划优化 2.2.1 Catalys的优化过程 2.2.2 Cache Manager优化 2 物理优化阶段 2.1 优化 Spark Plan 2.1.1 Catalyst 的 Join 策略 2.1.2 如何决定选择哪一种 Join 策略 2.2 Physical Plan 2.2.1 EnsureRequirements 规则 3 相关文…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十七章 Linux中断实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…