Python基础之字典

字典的存储方式

  • 字典是以键值对进行存储数据的
  • 字典的表示方式:{key:value,key2:value,key3:value}
dic={"jay":"周杰伦","greg":"许光汉"}##存数据
val=dic["jay"]#取出存储的数据
print(val)

字典的key必须是可哈希的数据类型,即不可变的数据类型;
字典的value可以是任何数据类型

字典的增删改查

字典里是不可能出现重复的key的

dic=dict()
#插入数据
dic["jay"]="周杰伦"
dic["jay"]="昆凌"#因为前面已经有相同的key值,所以这里执行的是修改操作

dic.setdefault("tom","忽略")#设置默认值,如果之前已经有了tom,那么这里就不起作用了

dic.pop("jay")#删除,根据key删除

print(dic['jay'])#根据字典里的key查询,如果key不存在,程序会报错
print(dic.get['jay'])#也可以进行查询操作,如果key不存在,程序返回none

字典的循环嵌套

dic={"1":xu
     "2":zhou
     "3":liu
     "4":zhao}
 #1.可以用for循环,直接拿到key
 for key in dic:
     print(key,dic[key])
     
 #2.希望把所有的key保存到一个列表中
 print(list(dic.keys()))#拿到所有的key了
 
 #3.希望把所有的value放到一个列表中
 print(list(dic.values()))

#4.直接拿到字典中的key和value
print(list(dic.items()))#这样打印出来嵌套比较多,比较乱
#可以用下面这样的循环
for key,value in dic.items():
     print(key,value)
 ###补充:
 ###a,b=(1,2)#元祖或者列表都可以执行该操作,该操作被陈伟解构(解包)
 ###print(a)
 ###print(b)

字典的嵌套

me={
    "name":"lexi",
    "age":"24",
    "teacher":{
          "name":"Tom",
          "age":"50",},
     "family":[
        {"rel":"father","age":"51"},
        {"rel":"mother","age":"49"},
        {"rel":"brother","age":"20"},
        ]
  }
#找me的老师的名字
name=me['teacher']['name']
print(name)
#给me的第二个家庭成员的年龄加1岁
me['family'][1]['age']=me['family'][1]['age']+1

字典的循环删除

dic={"刘大":xu
     "刘二":zhou
     "3":liu
     "4":zhao}
#把姓刘的都删掉
temp=[]#临时列表存放即将要删除的key
for key in dic:
    if key.startswith("刘"):  
        temp.append(key)
        #dic.pop(key)   #不能直接删,因为删除会改变字典的大小,而导致程序会报错
for t in temp:#循环列表,删除字典中的内容
    dic.pop(t)        
print(dic)

在删除的过程中出现“dictionary changed size during iteration”时,是因为迭代过程中字典的大小发生了改变。这会导致迭代器失效,从而触发该错误。解决这个问题的方法是避免在迭代过程中修改字典的大小。以下是几种可能的解决方案:

  1. 创建一个临时副本:在迭代字典之前,创建一个字典的副本,并对副本进行操作。这样可以避免直接在迭代过程中修改原始字典的大小。
my_dict = {'key1': 'value1', 'key2': 'value2'}
temp_dict = my_dict.copy()
for key, value in temp_dict.items():
    # 对字典进行操作,不会影响原始字典

  1. 使用列表保存需要删除的键:在迭代过程中,将需要删除的键保存在一个列表中,待迭代完成后再进行删除操作。
my_dict = {'key1': 'value1', 'key2': 'value2'}
keys_to_remove = []
for key, value in my_dict.items():
    if some_condition:
        keys_to_remove.append(key)
for key in keys_to_remove:
    del my_dict[key]

在上述代码中,我们首先创建一个空列表 keys_to_remove。在迭代字典的过程中,如果满足某个条件(在此示例中为 some_condition),则将当前键添加到 keys_to_remove 列表中。

一旦迭代完成,我们就可以遍历 keys_to_remove 列表,并使用 del 关键字从原始字典中删除相应的键。这种方式可以避免在迭代过程中修改字典大小而导致的错误。

请确保在实际使用时将 some_condition 替换为您自己的判断条件,并适应您的具体情况进行相应的修改。
3. 使用字典推导式创建新的字典:根据需要删除的键,通过字典推导式创建一个新的字典,而不是直接在迭代过程中修改原始字典。

my_dict = {'key1': 'value1', 'key2': 'value2'}
my_dict = {key: value for key, value in my_dict.items() if not some_condition}

<think>好的,我现在需要帮助用户学习Python字典的使用教程和示例,特别是参考了提供的引用内容。首先,我需要回顾用户提供的引用材料,看看有哪些相关信息可以利用。 引用[2]提到Python3的字典是键值对结构,可以用in检查键是否存在,并给出了示例代码。这是一个重要的点,应该包含在教程中。另外,引用[1]和[3]虽然主要关于类型和代码质量,但可能对理解字典基础有帮助,比如类型名称和最佳实践。 接下来,我需要按照用户的要求,结构清晰地组织教程,分步骤讲解字典的基本操作。用户需要教程和示例,所以每个部分都应该有代码示例。同时,用户提到2.5.2实验,可能希望看到类似实验的详细步骤,比如创建字典、增删改查、常用方法等。 我需要确保使用正确的LaTeX格式,比如行内公式用$...$,独立公式单独成段用$$...$$,但在这个问题中可能用到的数学公式不多,不过如果有的话要注意格式。例如,如果讲到哈希表的时间复杂度,可以写成$O(1)$。 另外,用户要求生成相关问题,我需要根据教程内容,提出几个相关的问题,帮助用户进一步学习。问题应该覆盖字典的操作、特性、应用场景等。 需要注意用户引用的来源,在回答中适当标注引用,例如在提到检查键是否存在时,引用[2]。同时,代码示例要正确,符合Python语法,并且有注释解释,这可能参考引用[1]中的代码示例风格。 可能还需要补充一些引用中没有提到的内容,比如字典的推导式、嵌套字典等,但确保信息准确,必要时可以提示用户参考更多资料。同时,引用[3]提到代码质量,所以在示例中强调最佳实践,比如使用get方法避免KeyError。 最后,检查回答是否符合所有系统级指令,特别是LaTeX格式和引用标识的正确使用,确保没有遗漏用户的要求,比如生成相关问题,并且结构清晰,逐步引导用户理解字典的使用。</think>### Python 字典使用教程及示例 #### 一、字典基础概念 Python字典(Dictionary)是一种**键值对(Key-Value)**的无序集合,通过哈希表实现$O(1)$时间复杂度的快速查找[^2]。键必须是不可变类型(如字符串、数字),值可以是任意数据类型。 #### 二、字典基本操作 1. **创建字典** ```python # 空字典 dict1 = {} # 直接初始化 dict2 = {"name": "Alice", "age": 25, "is_student": True} ``` 2. **增删改查** ```python # 添加/修改元素 dict2["city"] = "Beijing" # 添加键"city" dict2["age"] = 26 # 修改键"age"的值 # 删除元素 del dict2["is_student"] # 删除键"is_student" value = dict2.pop("name") # 弹出键"name"并返回值 # 查询元素 print(dict2["age"]) # 直接访问(键不存在会报错) print(dict2.get("gender", "Unknown")) # 安全访问,返回默认值 ``` 3. **遍历字典** ```python for key in dict2: # 遍历键 print(key, dict2[key]) for key, value in dict2.items(): # 同时遍历键值对 print(f"{key}: {value}") ``` #### 三、字典常用方法 | 方法 | 描述 | 示例 | |------|------|------| | `keys()` | 返回所有键 | `list(dict2.keys())` → `['age', 'city']` | | `values()` | 返回所有值 | `list(dict2.values())` → `[26, 'Beijing']` | | `update()` | 合并字典 | `dict2.update({"gender": "Female"})` | | `in`操作符 | 检查键是否存在 | `if 'age' in dict2: ...` | #### 四、高级应用 1. **字典推导式** ```python squares = {x: x**2 for x in range(5)} # 输出:{0:0, 1:1, 2:4, 3:9, 4:16} ``` 2. **嵌套字典** ```python students = { "001": {"name": "Bob", "courses": ["Math", "Physics"]}, "002": {"name": "Eve", "courses": ["Chemistry"]} } print(students["001"]["courses"][0]) # 输出:"Math" ``` #### 五、注意事项 - 避免直接通过`dict[key]`访问不存在的键,优先使用`get()`方法[^3] - 字典Python 3.7+中会保持插入顺序,但设计上仍视为无序集合 - 键的唯一性:重复键会覆盖原有值 $$ \text{字典容量负载因子} = \frac{\text{已用存储量}}{\text{总存储量}} $$ 当负载因子超过$2/3$时,字典会自动扩容以保证性能[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值