ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

python入门到实践:第2章-4.字典

python入门到实践:第2章-4.字典 一个简单的字典假设存在一款有关外星人的游戏, 这些外星人在数量方面存在差异, 于颜色上也是各不相同, 接下来借助一个字典去存储这些外星人的基本信息:使用字典在其中, 字典, 它是一系列的键值对这一现象存在着情形, 此情形为每个键都跟一个值产生关联, 借助键能够去到访与之产生关联的那个值, 和键产生关联的值涵盖数字、字符串、列表甚至字典等情况, 实际上, 任意对象都能够被当作字典里的值来使用。于其中, 字典借花括号{}予以创建, 其内部贮存着一众键值对每一键值对涵盖两个彼此相关联的值。当你明确指定键时, 便会返回与之相关联的值。键与值之间借冒号予以分隔, 而键值对之间则运用逗号加以分隔。于字典之中, 你欲存储任意数量的键值对皆可行得通。【1】访问字典中的值若想要去获取那与键相互关联着的值, 那么能够采取指定字典名之后并将键放置于其紧接着后面的方括号之内的方式, 就像这样【2】添加键值对字典属于一种动态的数据类型, 能够在里面随时去添加键值对。若要添加键值对, 那么可以依次去指定字典名, 还有用方括号括起来的键以及和它相关联的值。比如说, 随后给上述的外星人游戏添加外星人的坐标位置:【3】从创建一个空字典开始有时候, 给空字典增添键值对这种行为是必不可少的环节。为达成此操作流程, 可用一对空荡荡的花括号来定义一个字典, 而后在不同行分别添加各个键值对。比如说:倘若打算运用字典去存放用户所给予的数据, 或者撰写能够自行生成大量键值对的代码, 一般来讲, 都得先定义一个空字典。【4】修改字典中的值将字典当中的值予以修改时, 能够逐个去指定字典的名称, 还有用方括号括起来的键, 以及和该键产生关联的新的值。假定伴随着游戏的持续推进, 有必要把一个外星人的颜色转变为黄色:输出表明颜色已经发生了改变。瞧瞧一个更具趣味的事例: 针对一个外星人的移动速度展开位置追踪。为达成此目的, 储存该外星人当下的速度, 并且依据这一速度来判定外星人朝着右边移动了多少距离:【5】删除键值对字典里要是有不需要的信息, 那就能够运用del语句把对应的键值对给完全删除掉。在运用这个del语句之时, 一定要明确指定字典的名称以及打算删除的键, 就像这样:被称为del语句的操作, 会致使把键为speed的项从字典里面除去来, 一起除去跟其相互关联着的值。注意del删除的键值对是永久删除的【6】由类似的对象组成的字典于先前的示例里头, 用来存储的字典是给予一个特定对象的多种不同种类方面的信息, 而我们能够运用这样子的字典去存储好多来自于许多对象的仅仅独独同相同样一种类别的信息。好似:若要确定需用多行来定义字典, 先输入左花括号, 再按回车键, 于下一行实行缩进, 指明第一个键值对, 且在其后面添上逗号, 此后持续如此回车添加键值对, 直至结束在下行加上右花括号。【7】使用get()来访问值要是运用放置于括号里面的键去从字典那儿获取与之对应的那个值, 极有可能会引发一些问题, 倘若所指定的那个键并不存在于此, 那就将会出现报错的情况:话说对于字典来讲, 为了防止出现那般错误, 能够运用get()方法, 在指定的那个键不存在之际, 会返回一个默认值none。get()方法的头一个参数, 用来指定键, 这可是绝对不能少的第二个参数, 是当指定的键不存在之时的返回值, 它是可以选择的。当指定的键存在不存在具有可能性时, 应当思考采用get()方法, 而非运用方括号表示的形式。#练习 person { name:xiaoze, age:22, hobby:game, job:edveloper } print(person[name]) print(person[age]) print(person[hobby]) print(person[job]) if person[hobby] game: print(yes) else: print(no)遍历字典鉴于字典能够存储大量的数据, 并且也是支持对字典进行遍历的。遍历字典存在多种方式, 既能够遍历字典全部的键值对, 又能够仅仅遍历键或者值。【1】遍历所有的键值对必须借助for循环去遍历字典, 得先声明两个变量, 这两个变量各自用以存储字典里的键与值。这俩变量能够是随便什么名字, 尔后for语句的第二步部分要涵盖字典名以及方法items(), 这里面items()方法能够返回一个键值对所构成的列表。通过for循环, 依序给确定的两个变量赋予每一个键值对。随后的\n致使每次输出键值对之后, 插入一行空白, 以利于查看。【2】遍历字典中所有的键可以使用keys()方法去遍历字典中所有的键。进行字典遍历的时候, 会按照默认设置去遍历全部的键, 所以在不运用方法的情形下, 输出的结果同样是这样的:“keys()”方法, 不等于仅仅用在遍历方面, 事实上, 它给出的是一个列表, 这个列表含有字典里全部的键:【3】按照特定的顺序遍历字典中的所有键有一种方法, 要以特定的顺序返回元素, 那就要在for循环里, 对返回的键进行排序, 为了做到这一点, 可以使用()函数, 来获取按特定顺序排列的键列表的副本:【4】遍历字典中所有的值使用()方法它会返回一个值的列表凭借()方法能够提取出字典里所有的值, 然而此方法不会去考量值是否有重复之情况。当最终的列表里存在海量重复的值之际, 那就需要去除重复的项, 此时能够运用集合set()。集合当中的每一个元素都必定是全然独一无二的:把包含重复元素的列表传进set(), 能找出列表里独一无二的元素, 再借助这些元素去创建一个集合。#练习 river {nile:egypt,yangtze:china,ganges:india} for key, value in river.items(): print(fthe {key} runs through {value}) for key in river.keys(): print(key) for value in river.values(): print(value)嵌套有的时候, 要把很多个字典放置在列表里头, 或者把列表当作值存于字典当中这就叫做嵌套。能够在列表里嵌套字典, 也能够在字典里嵌套列表, 甚至在字典里嵌套字典, 在列表里嵌套列表。【1】字典列表制造出一个外星人清单, 当中的每一个外星人皆是一个词典, 涵盖着该外星人拥有的全部信息。可是在现实游戏里这绝无仅有限于三个外星人的可能, 并且每一个外星人皆是依靠代码自行生成的。比如说, 运用range()生成30个外星人:aliens [] #创建一个空列表用于存储外星人 #创建30个绿色的外星人 for alien_number in range(30): #循环30次 #每次循环都创建一个外星人 alien_new {color:green,points:5,speed:slow} aliens.append(alien_new) #每次创建的外星人都追加到列表中 #显示前5个外星人 for ale in aliens[:5]: print(ale) print() #显示创建了多少个外星人 print(ftotal number of aliens:{len(aliens)})每一个外星人, 都有着相同的特性, 然而, 在我们看来, 每个外星人都是单独存在的个体, 这使得我们能够逐个地、分别地去修改每一个外星人。哪些情形之下是需要去处理出现重复状况的数据的呢, 伴随游戏不断推进, 存在一些外星人是会发生颜色改变的模样, 并且其移动的速度也会变快在具备必要性的时候, 能够运用for循环以及if语句去对某些外星人的颜色作出修改, 比如说, 要把排在前面的10个外星人变更为黄色, 速度处于中等的程度, 并且价值为10分:那些代码还能够进一步地去进行拓展, 在那里面增添一个elif语句, 把黄色星球上的外太空物体修改成为移动速度比较快的红色星球上的外太空物体:aliens [] #创建一个空列表用于存储外星人 #创建30个绿色的外星人 for alien_number in range(30): #循环30次 #每次循环都创建一个外星人 alien_new {color:green,points:5,speed:slow} aliens.append(alien_new) #每次创建的外星人都追加到列表中 for alien in aliens[:3]: if alien[color] green: alien[color] yellow alien[points] 10 alien[speed] medium elif alien[color] yellow: alien[color] red alien[points] 15 alien[speed] fast #显示前5个外星人 for ale in aliens[:5]: print(ale)【2】在字典中存储列表有时候, 存在这样一种情况, 即需要把列表存于字典当中。比如说, 该如何去描述顾客所点的披萨呢? 要是借助列表来进行描述, 那么仅仅能够存储打算添加的披萨配料然而要是运用字典来描述, 那么其中仅仅能够添加一种配料。#存储顾客点的披萨信息 pizza { crust:thick, toppings:[mushrooms,extra_cheese], } #概述顾客点的披萨 print(fyou ordered a {pizza[crust]}-crust pizza with the following toppings:) #当字符串很长时可以分行写 for topping in pizza[toppings]: print(f\t{topping})每当存在这样的情况, 即需要于字典里把一个键关联至多个值时, 都能够在字典之中嵌套放置一个列表。在针对访问调查之时, 假定调查每个个体所喜爱的编程语言是哪些, 把每个个体的回答皆存储于一个列表里, 且被调查人员能够挑选好些个答案, 处于这种情形之下。当那咱们去遍历该列表的时候, 跟每一个接受调查的人员相联系关联的都是一个语言列表, 而非仅只是一种代码语句。所以, 在遍历字典的那个for循环当中, 还得再运用一个for循环去遍历跟被调查者相挂钩关联的语言列表噢: 。favorite_languages { jen:[python,c], ahdu:[C], sdioaj:[java,go], jdiw:[javascript,python,ruby] } for name, languages in favorite_languages.items(): print(f\n{name.title()}s favorite languages are:) for lgs in languages: print(f\t{lgs.title()})注意列表和字典的嵌套层级不要太多【3】在字典中存储字典可以在字典里头嵌套字典, 然而这么做会致使代码变得极其繁杂。要是存在一个既有多个用户, 且每个用户都具备独特用户名的网站, 能够在字典里把用户名当作键, 接着把每个用户的信息存储于一个字典内, 并且将这个字典作为与用户相互关联的值, 比如, 存储每个用户的三项信息, 分别是名、姓以及居住地。为了去访问这些信息, 在遍历全部用户名之后, 还得访问和每个用户名相关联的信息字典:users { aeinstein:{ first:albert, last:einstein, location:princeton }, mcurie:{ first:marie, last:curie, location:paris } } for username, user_info in users.items(): print(f\nUserneme:{username}) #首先将用户名打印出来 #访问内部字典生成完整的名字信息 full_name f{user_info[first]} {user_info[last]} location user_info[location] #打印完成的信息 print(f\tFull_name:{full_name.title()}) print(f\tLocation:{location.title()})输出Userneme:aeinstein Full_name:Albert Einstein Location:Princeton Userneme:mcurie Full_name:Marie Curie Location:Paris【练习】aeinstein {name:albert,location:princeton} mcurie {name:marie,location:paris} siihs {name:curie,location:chengdu} people [aeinstein,mcurie,siihs] for pl in people: print(f{pl[name]} live in {pl[location]})# 定义多个宠物字典每个字典包含宠物类型、主人姓名 pet_list [ { pet_type: cat, # 宠物类型 owner_name: Xiaoze# 主人名字 }, { pet_type: dog, owner_name: Tom }, { pet_type: rabbit, owner_name: Lily }, { pet_type: goldfish, owner_name: Jack } ] # 遍历列表打印所有宠物信息 for pet in pet_list: print(f宠物类型{pet[pet_type]}主人{pet[owner_name]})favorite_places { 小明: [北京, 上海], 小红: [杭州, 成都, 西安], 小刚: [深圳] } for name, places in favorite_places.items(): print(f\n{name} 喜欢的地方) for place in places: print(f - {place})favorite_numbers { Alice: [7, 13, 42], Bob: [3, 9], Charlie: [1, 11, 100, 256] } for name, numbers in favorite_numbers.items(): print(f\n{name} 喜欢的数字) for number in numbers: print(f - {number})cities { 北京: { country: 中国, population: 约2180万, fact: 拥有世界最大的城市广场——天安门广场 }, 东京: { country: 日本, population: 约1400万, fact: 是世界上人口最多的都市圈之一 }, 纽约: { country: 美国, population: 约840万, fact: 自由女神像是法国于1886年赠送给美国的礼物 } } for city_name, city_info in cities.items(): print(f\n城市{city_name}) print(f 国家{city_info[country]}) print(f 人口{city_info[population]}) print(f 趣事{city_info[fact]})cities { 北京: { country: 中国, population: 约2180万, fact: 拥有世界最大的城市广场——天安门广场, language: 中文普通话, famous_food: 北京烤鸭 }, 东京: { country: 日本, population: 约1400万, fact: 是世界上人口最多的都市圈之一, language: 日语, famous_food: 寿司 }, 纽约: { country: 美国, population: 约840万, fact: 自由女神像是法国于1886年赠送给美国的礼物, language: 英语, famous_food: 纽约披萨 } } print( * 40) for city_name, city_info in cities.items(): print(f\n️ {city_name}) print(- * 30) for key, value in city_info.items(): label { country: 国家, population: 人口, fact: 趣事, language: 语言, famous_food: 著名美食 }.get(key, key) print(f {label}{value}) print(\n * 40)
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进