创建和使用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')