字典的存储方式
- 字典是以键值对进行存储数据的
- 字典的表示方式:{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”时,是因为迭代过程中字典的大小发生了改变。这会导致迭代器失效,从而触发该错误。解决这个问题的方法是避免在迭代过程中修改字典的大小。以下是几种可能的解决方案:
- 创建一个临时副本:在迭代字典之前,创建一个字典的副本,并对副本进行操作。这样可以避免直接在迭代过程中修改原始字典的大小。
my_dict = {'key1': 'value1', 'key2': 'value2'}
temp_dict = my_dict.copy()
for key, value in temp_dict.items():
# 对字典进行操作,不会影响原始字典
- 使用列表保存需要删除的键:在迭代过程中,将需要删除的键保存在一个列表中,待迭代完成后再进行删除操作。
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}