
c++容器中,我们学过一个存储键值对的容器——map容器,它的底层由二叉树实现,可以通过键来访问相关联的值。
python中也有类似的一个数据结构——字典:
字典是一系列键值对,每个键都与一个值相关联,也是可以通过键来访问相关联的值,底层由哈希表实现。
它的书写方式如下:
# 字典用放在花括号内的一系列键值对表示
# 字典的格式为键1:值1,键2:值2......
student_0 = {"grade":"five","age":11}
# 要获取与键相关联的值,可指定字典名和放在方括号内的键
print(student_0["grade"],student_0["age"])
# 输出:five 11
student_0 = {"grade":"five","age":11}
student_0["class"]="one"# 添加一个键值对,键为“class”,值为“one”
print(student_0)
student_0["class"]="two"# 修改一个键值对,键为“class”,值为“two”
print(student_0)
# 输出:{'grade': 'five', 'age': 11, 'class': 'one'}
# {'grade': 'five', 'age': 11, 'class': 'two'}
student_0 = {"grade":"five","age":11}
del student_0["grade"]
print(student_0)
# 输出:{'age': 11}
利用方法.item()返回一个键值对列表
student_0 = {"grade":"five","age":11,"class":"two"}
# 可以用for循环遍历所有键值对
# 用两个变量key和value分别储存键和值
for key,value in student_0.items(): # 方法.item()返回一个键值对列表
print("\nKey:"+key)
print("Value:"+str(value))
输出:

利用方法.keys()返回包含字典里所有键的列表
student_0 = {"grade":"five","age":11,"class":"two"}
# 用变量key储存键
for key in student_0.keys(): # 方法.keys()返回包含字典里所有键的列表
print("Key:"+key)
# 输出:
# Key:grade
# Key:age
# Key:class
注:遍历字典时,如果不点出方法,其实默认就是遍历所有键,也就是上述代码也可以写作for key in student_0:
利用方法.value()返回一个包含字典所有值的列表
使用方法和上面两个并没有差异,
但我们需要注意一个点,字典的键默认是不可以重复的,但是键所对应的值却没有强制规定,可能出现重复现象。
所以如果你有剔除重复项的需求,可以使用函数set()进行强制类型转换,把列表类型转换为没有重复的集合类型。当然字典的遍历默认是无序的,想要对它排序,可以用我们第一期提到的sorted()函数来获取按特定顺序排列的键列表副本
# 记录下来所有人喜欢的语言,并且遍历打印出来都有什么,不允许重复
favorite_languages ={"jen":"python","sarah":"c","edward":"ruby","phil":"python"}
print("The following languages have been mentioned:")
for language in sorted(set(favorite_languages.values())):
print(language.title())
# 列表中嵌套了3个学生字典
student_0={"name":"jen","favorite_language":"python"}
student_1={"name":"sarah","favorite_language":"c"}
student_2={"name":"phil","favorite_language":"python"}
students=[student_0,student_1,student_2]
print(students)

每当字典中的某个键需要关联多个值时,都可以把列表嵌套进去
# 一个简易点披萨系统,用字典指定饼皮的薄厚、上面的小料都有什么,并以一定格式打印概述
my_pizza = {
"crust":"thick",
"toppings":["mushrooms","extra cheese"]# 列表嵌套在字典里
}
print("You ordered a"+my_pizza["crust"]+"-crust pizza"+
"with the following toppings:")
for topping in my_pizza["toppings"]:
print("\t"+topping)

至于字典自身的嵌套,理论上当然可行,但是容易把简单的问题复杂化,并且代码结构不清晰,所以这里就不展开讲了,若感兴趣,可以自己打代码看一看。
获取用户输入可以使用input()函数,咱们在第二期if语句的补充那里提到过,参数是打印给用户的提示信息
# 可以直接指定提示信息
name = input("Tell me your name:\n")
#也可以用变量储存提示信息,格式更加灵活
prompt = "Thanks,"+name+"\n"
prompt+="\nHow old are you:\n"
age = input(prompt)
print("\nHello,"+name+"-"+age)

可以看到我们最后一行代码,直接+age,而不用做str()这样的强制类型转换,这足以说明,使用函数input()时,python会将用户输入解读为字符串。
前面咱们已经看过很多python的语法了,他们所能实现的目标与c语言并无差异,只是形式不太相同:
while语句在c语言里的格式为:
while(条件){
执行代码1
执行代码2
}
在python中的格式为:
while 条件 :
[缩进]执行代码1
[缩进]执行代码2
另注:在python的while循环里,也同样可以使用break与continue,用法与c语言一样。
count=0
whileTrue:
count+=1
if count ==2:
print("遇到2,跳出本次循环")
continue
print("当前:",count)
if count==4:
print("遇到4,退出循环")
break

for循环遍历列表时,是按索引顺序逐个访问元素的。
而列表的底层是连续存储的动态数组,一旦在遍历过程中删除元素,后续元素会自动向前移动,
导致for循环的索引和实际元素错位,进而导致遍历过程中的遗漏。
所以,最好的列表处理方案是,只读用for,修改用while。
小编碎碎念
如果你已经学过了其他语言,再想接触python,其实最好的办法不是看网课,而是直接看书,或者可以看别人做的笔记,然后直接写代码验证学习。
我的这些笔记,是阅读过业界公认的python入门友好书籍,提炼总结出来的,如有模糊之处,也推荐大家买一本这个书,看一看该书作者精彩的讲解,感受一下python的精妙。
我是一只思绪漫游的00后,欢迎关注~