学会把复杂问题拆解成自己已经掌握的基础问题才是正确的学习之道

1.编写一个函数,读入words.txt,并将它们作为键保存到一个字典中

后面还有使用in检查某单词是否在字典中,按说这个并不难,先读取单词表,然后通过将单词作为键,值用空字符就可以了,然后代码如下:

def read_dict():

fin=open('words.txt')

words_dict={}

for line in fin:

word=line.split()

words_dict[word]=''

return words_dict

read_dict()

TypeError Traceback (most recent call last)

in

7 words_dict[word]=''

8 return words_dict

----> 9 read_dict()

in read_dict()

5 for line in fin:

6 word=line.split()

----> 7 words_dict[word]=''

8 return words_dict

9 read_dict()

TypeError: unhashable type: 'list'

但是报错了,具体原因也弄不清楚,只能先把循环单独拿出来比对一下

fin=open('words.txt')

for line in fin:

word=line.split()

print(word)

['aa']

['aah']

['aahed']

['aahing']

['aahs']

['aal']

['aalii']

['aaliis']

['aals']

显示的是这样的,我记得前面读取的时候没有中括号,仔细看发现错在word=line.split(),split是做分割用的,本来这里应该用strip去空格的,只凭记忆写的记混了,然后改一下

def read_dict():

fin=open('words.txt')

words_dict={}

for line in fin:

word=line.split()

words_dict[word]=''

return words_dict

read_dict()

这次显示就正常了,如果只到这没下面的检查单词是否在字典中这段代码是没有问题的,但是要检查一个单词是否在字典的键中就需要用到字典,而在函数中字典是局部引用,没法在别处使用的,所以当检查单词是否在字典中时会报错:words_dict没有被定义,所以需要把它放到函数外面,最终改成如下:

fin=open('words.txt')

words_dict={}

def read_dict():

for line in fin:

word=line.strip()

words_dict[word]=''

return words_dict

read_dict()

'hello' in words_dict

代码是输出正常了,但是总觉得这个方法有点怪,也许会有更好的方法,后面找到再说。

2.使用字典作为计数器集合

def histogram(s):

d=dict()

for c in s:

if c not in d:

d[c]=1

else:

d[c]+=1

return d

h=histogram('faljgaldkjalgkjeweraldfjsl')

print(h)

{'f': 2, 'a': 4, 'l': 5, 'j': 4, 'g': 2, 'd': 2, 'k': 2, 'e': 2, 'w': 1, 'r': 1, 's': 1}

这是比较常规的做法,字典有一个方法get,接收一个键和一个默认值,如果键出现在字典中,get返回对应的值,否则返回默认值,接下来用get来替代上面的代码

def histogram(s):

d=dict()

for c in s:

d[c]=int(d.get(c,'0'))+1

return d

h=histogram('faljgaldkjalgkjeweraldfjsl')

print(h)

get默认值设为0,如果c不在d,返回0,通过加1,d[c]=1,下次再检查这个值时,因为在d中会返回1,再通过加一变成2,这样就通过循环得出结果,省去了判断条件

3.反转字典

将原字典的值变为新字典的键,原字典的键变为新字典的值。

原来的方法还是通过键来做遍历,然后每次将对应的值去和新的字典中去比对,如果没有新增一个键值对,如果有了只在原来的值上增加一个新值

def invert_dict(d):

invert=dict()

for key in d:

val=d[key]

if val not in invert:

invert[val]=[key]

else:

invert[val].append(key)

return invert

d=histogram('parrot')

print(d)

invert_dict(d)

{'p': 1, 'a': 1, 'r': 2, 'o': 1, 't': 1}

{1: ['p', 'a', 'o', 't'], 2: ['r']}

字典有个方法setdefault,通过这个方法将上面的函数写得更简洁些:

setdefault(key['default']):如果字典存在键 key ,返回它的值。如果不存在,插入值为 default 的键 key ,并返回 default 。 default 默认为 None。

按照上面的描述需要先做几个实验,因为我们需要在空字典里新增键值对,需要用空字典测试一下setdefault方法

a=dict()

a.setdefault('b',1)

返回值是1,print(a)返回是{'b': 1},这样说如果字典里没有就会按照括号里的内容变成键值对放到字典里,再测试下

a.setdefault('b',2)

print(a)

返回值还是{'b': 1},这样基本上就懂了,如果已经存在返回还是1,我们需要在循环时如果键已经存在字典中需要增加键的值,那么刚开始设置为空字符,不过需要测试下类型:

type(a.setdefault('a',''))

返回值是str,那么就再测试下用list能不能将空字符串转换为列表

list(a.setdefault('a',''))

返回值是[],那么就可以写代码了

def invert_dict(d):

invert=dict()

for key in d:

val=d[key]

invert[val]=list(invert.setdefault(val,'')).append(key)

return invert

d=histogram('parrot')

invert_dict(d)

TypeError Traceback (most recent call last)

in

7 return invert

8 d=histogram('parrot')

----> 9 invert_dict(d)

in invert_dict(d)

4 for key in d:

5 val=d[key]

----> 6 invert[val]=list(invert.setdefault(val,'')).append(key)

7 return invert

8 d=histogram('parrot')

TypeError: 'NoneType' object is not iterable

上网查了下报错原因说一般发生在将None赋给多个值时,还是需要先拆解成小代码块检查

b=dict()

b['a']=list(b.setdefault('a','')).append('hello')

print(b)

返回值是{'a': None},本来预期是后面变成hello结果用append没有效果,换“+”试试

b=dict()

b['a']=list(b.setdefault('a',''))+['hello']

print(b)

{'a': ['hello']}

这次返回值倒是正常了,上面报错看出是用append键的值都是None才报错的,下面将append改成“+”

def invert_dict(d):

invert=dict()

for key in d:

val=d[key]

invert[val]=list(invert.setdefault(val,''))+[key]

return invert

d=histogram('parrot')

invert_dict(d)

这次返回结果是正常的了。

看了答案代码如下

def invert_dict(d):

"""Inverts a dictionary, returning a map from val to a list of keys.

If the mapping key->val appears in d, then in the new dictionary

val maps to a list that includes key.

d: dict

Returns: dict

"""

inverse = {}

for key, val in d.items():

inverse.setdefault(val, []).append(key)

return inverse

if __name__ == '__main__':

d = dict(a=1, b=2, c=3, z=1)

inverse = invert_dict(d)

# for val, keys in inverse.items():

# print( val, keys)

print(inverse)

发现了几个问题,首先我不知道字典可以用for key, val in d.items(),这样可以节省一些代码,dict.items(返回的对象是一个动态试图,当字典变是,视图也会变。

另外答案用的是inverse.setdefault(val, []).append(key),而不是用将值赋给value,就说明我对这个setdefault并没有完全理解,另外我也发现了一个问题,我用的是' ',答案用的是[],倒是省了再转化成list了。还一个让我更清楚的是有返回值和没有返回值的情况,例如

[1,2]+[3]

返回值是[1,2,3]

但是用[1,2].append('3'),返回值是None,这也就说明了为什么会在前面报上面的错误。

4.编写一个程序,读入单词表,并找到所有轮转对。

轮转对:两个单词,如果可以使用轮转操作将一个转换为另一个,则成为轮转对。例如ad轮转一步变为be。

遇到一个大的问题没头绪首先要想一下能将这个问题分解成哪些已经做过的,读入单词表这个以前做过了,轮转操作在ROT13那个练习中也做过了。那么大体思路就是读入单词表,用遍历方式将每个单词轮转1到25步,因为26步是本身,然后将轮转后的单词查看是否在单词表中,如果在就打印出来这两个词就可以了。

import bisect

def rotate_word(word,num): #轮转单词

new_word=''

for letter in word:

if letter.isupper():

start=ord('A')

elif letter.islower():

start=ord('a')

new_word=new_word+(chr((ord(letter)-start+num+26)%26+start))

return new_word

# rotate_word('melon',-10)

def find_lt(a,x): #查找单词是否在单词表中

i=bisect.bisect_left(a,x)

if i != len(a) and a[i]==x:

return True

return None

def read_words(): #读取单词表

fin=open('words.txt')

t=[]

for line in fin:

word=line.strip()

t.append(word)

return t

def sdf():

t=read_words()

for s in t:

for i in range(1,26):

new_words=rotate_word(s,i)

if find_lt(t,new_words):

print(s,i,new_words)

sdf()

总结:注意一个方法或函数最后是有返回值还是没返回值的情况。

从今天看出有些时候会发现答案给的代码中会有一些内置函数或方法使得编程变得很简单,这当然很好,所以应该多多阅读标准库。但是在不知道这个的情况下也能做出来也非常好。就像刚开始学英语时,比较好的练习方式是用已掌握的一些简单词汇能把一些你没遇到的复杂事物或情况描述出来。所以一是要多多掌握简便的方法,也要学着把复杂问题转换成自己已经掌握的方法来解决。

python自学第8天字典_python自学日记7——字典相关推荐

  1. python用input输入字典_输入字典python_python输入字典_python用input输入字典 - 云+社区 - 腾讯云...

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本篇将介绍python里面的字典,更多内容请参考:python学习指南 pyth ...

  2. python两个字典合并为一个新字典_Python合并2个字典成1个新字典的方法(9种)

    字典是Python语言中唯一的映射类型. 映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表. 字典对象是可变的,它是一个容器类型,能存储任意个 ...

  3. python数据类型哪些是无序的_Python自学知识-Python中的数据类型有哪些?

    今天小编要跟大家分享的文章是关于Python自学知识-Python中的数据类型有哪些?正在自学Python知识的小伙伴们来和小编一起看一看吧,希望能够对大家有所帮助!Python中主要有8种数据类型: ...

  4. python软件在哪里自学好_python自学教程【安装python及第一个程序】

    大家好,今天开始我会与大家分享一下我在自学python的一些经验以及方法,我会尽量把文章写得更像教程(就是那种0基础,只要开了就懂的),所以文中可能很少涉及 到理论以及代码背后的知识,这些东西对于初学 ...

  5. c++ 字典_Python自学笔记(五):字典

    一.字典示例 什么是字典?把相关信息关联起来的数据结构.例如通过查汉语字典找到某个字.词的含义,字词与他们的含义就是一种相关信息. Python字典用大括号({})括起来,逗号(,)分隔元素. 通过汉 ...

  6. python全局变量的声明和使用_python自学篇(第三章:函数)

    函数 在前面章节中,介绍了一些input(),print(),len()等内建函数,还有random,math等标准库相关函数,这些都是可以直接使用的,但是很多时候,我们也是可以编写自己的函数. 看个 ...

  7. python输入一个列表的语句_python自学笔记使用if语句处理列表作业

    1.以特殊 方式跟管理员打招呼:创建一个至少包含5个用户名的列表,且其中一个用户名为'admin'.想象你要编写代码,在每位用户登陆网站后都打印一条问消息.遍历用户列表,并向每位用户都打印一条问候消息 ...

  8. python列表和字典_python使用for遍历字典、列表和字符串的几种方法

    使用for遍历字典: 1.遍历key值,value值(下面写法完全等价): a = {'a': '1', 'b': '2', 'c': '3'} 方式一: for key in a: print(ke ...

  9. python 去重 字典_python按照list中字典的某key去重的示例代码

    一.需求说明 当我们写爬虫的时候,经常会遇到json格式的数据,它通常是如下结构: data = [{'name':'小K','score':100}, {'name':'小J','score':98 ...

最新文章

  1. 2019 年容器生态统计报告发布 | 云原生生态周报 Vol. 26
  2. 云炬随笔20211126(2)
  3. Oracle:容器数据库简介
  4. sh 脚本执行sql文件传参数
  5. Android从无知到有知——NO.7
  6. 一日一技:一文搞懂Python错误和异常
  7. go写的图片爬虫,支持单页以及列表
  8. Zoom 是如何击败科技巨头的?
  9. Windows7下Edge的首页关闭我的资讯,兴趣等
  10. 每日工作问题记录总结(好习惯 打卡2/?)
  11. 最流行前端开发框架对比评测
  12. 怎样从电脑传入视频到ipad 播放
  13. HTTP协议网络请求状态码
  14. 服务器和售票系统,网上售票系统的开发与实现.doc
  15. Unity Texture2D的可读性问题
  16. windows8 下载
  17. 【RDMA】RDMA编程
  18. Category 的理解
  19. 基于LabVIEW+python实现车牌识别智能系统的设计
  20. python驱动:ddt用法

热门文章

  1. Spring Security 3.1 中功能强大的加密工具 PasswordEncoder
  2. 在Android中取得当前进程名
  3. DOS之BAT批处理文件语法3(转)
  4. 「THUPC2018」赛艇 / Citing
  5. 输入一组整数,0结束输入,之后输出输入的最大的和最小的整数.【思路】
  6. CCF201612-3 权限查询(100分)
  7. UEFI、BIOS、Secure Boot的关系和知识介绍
  8. PHP关联数组和哈希表(hash table) 未指定
  9. 快速搭建samba服务
  10. 也谈谈程序员职业规划的几个问题——我的一些故事