2020-05
2

改变字典规则不香吗?

By xrspook @ 20:55:44 归类于: 扮IT

改变字典的键值规则就可以把从一本书里挑随机单词这件事轻松搞定,我真搞不懂参考答案为啥要那么折腾。在Think Python 2的第十三章里,字典的默认规则是单词是键,词频是键值。既然这道题要唯一的索引找随机单词,我把键值变成唯一序号不就完事大吉了?再来一个zip把字典的键值和键互换,random.choice()直接就到达随机单词了。我只改了生成字典的规则,耗时0.12秒,参考答案折腾了不只一点点,耗时0.42秒。之所以参考答案不修改字典规则,是因为他们要灌输python拼装模块的特性,拼装很方便,但事实证明效率不一定最高。

This algorithm works, but it is not very efficient; each time you choose a random word, it rebuilds the list, which is as big as the original book. An obvious improvement is to build the list once and then make multiple selections, but the list is still big.

An alternative is: Use keys to get a list of the words in the book. Build a list that contains the cumulative sum of the word frequencies (see Exercise 2). The last item in this list is the total number of words in the book, n. Choose a random number from 1 to n. Use a bisection search (See Exercise 10) to find the index where the random number would be inserted in the cumulative sum. Use the index to find the corresponding word in the word list.

Exercise 7: Write a program that uses this algorithm to choose a random word from the book. Solution: http://thinkpython2.com/code/analyze_book3.py.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import string
import random
from time import time
def set_book(fin1):
    useless = string.punctuation + string.whitespace + '“' + '”' # 标点符号、换行符全部咔嚓掉
    d = {}
    i = 1
    for line in fin1:
        line = line.replace('-', ' ') # 有-的单词全部一分为二,这样真的好吗?
        for word in line.split():
            word = word.strip(useless)
            word = word.lower()
            if word not in d:
                d[word] = i # 录入字典的时候键值就是序号
                i += 1
            # d[word] = d.get(word, 0) + 1 # 反正我不算词频,这个没必要了
    return d
fin1 = open('emma.txt', encoding='utf-8')
start = time()
book1 = set_book(fin1)
book2 = dict(zip(book1.values(), book1.keys())) # 键和键值互换,序号成了唯一索引号
print('100 random words in book')
for i in range(100):
    if i > 1 and i%8 == 0:
        print()
    print(random.choice(book2), end=' ') # 索引号找词,想多快有多快
print()
end = time()
print(end - start)
# 100 random words in book
# solicit laughing preserve inebriety elton's unimpeded effusions unselfish
# intimate connect native judges charities travel informs colours
# enigmas bragge case greensward cox's particularly unexampled promise
# prone greensward dignity maps fourth christmas creature maximum
# graver mildest pleasant corrected increased named partridge marks
# following kept gloom conjecturing parlour inheriting say consulting
# magnified abundant produces sons malt add unenforceability beautifully
# richly striking confuse greatness asleep steps humility upon
# already paper delight liberties confide appendages undecided male
# prophecies esteem unadorned likelihood shopping deeply unbiased horrors
# man's dumplings business chapter shakespeare sees counsels attentive
# silenced ventured singular double mean waltzes requisite checks
# unattended qualified blessed surmises
# 0.12100672721862793
2020-05
2

外公

By xrspook @ 17:36:09 归类于: 烂日记

在找今天话题的时候,我想到了外公。还记得在外婆家住的日子,我知道外公每天早上都会很早起来,然后开始折腾他那套茶具。我们不是潮汕人,所以我们没有潮汕人那些复杂的东西,但是外公每天早上都会仔细地把两个暖瓶,一个冷水瓶和一个茶壶洗干净,其中也包括大家的杯子。除了洗那些茶具以外,他也把那个柜子擦得很干净,无论是柜面上铺了玻璃的地方还是里面。那个小小的柜子,除了放茶杯以外,还放着几个小酒杯。正餐的时候,外公总要喝一点点广东米酒。真的只是一点点而已,10毫升不到。我还记得外公那个小酒杯上面的花纹是一个跳舞的女人,她在跳民族舞。折腾完那一堆以后,外公就会坐在那里,等待其他人起床。我不记得外公是几点起床的了,反正冬天的时候,即便天没亮,也会看他准备就绪坐在那里。因为他起得比我们早,所以我不知道他是先穿戴好再去洗那些茶具,还是反过来。在没有消毒碗柜的时候时代,那里的杯子永远是拿起来就能用,绝对是干净的。那个时候的外公还没有非常明显的老人痴呆症。

住在那里的时候,我们烧的是蜂窝煤,如果有柴也会烧一烧。70多岁的外公可以把两箩筐的蜂窝煤挑上3楼。从我们家到卖蜂窝煤的地方还有一个很长的斜坡。恶心的是回家的路上刚好是上坡。外公的生活习惯挺神奇,下午三四点就会洗澡,晚上8点多就开始上床睡觉。虽然外公很早就睡觉,但我们这些小孩和外婆通常会到晚上10点甚至之后才睡觉。所以在他睡觉的时候,其实我们仍然在打闹的,但他却从来不会投诉我们。无论我们在打闹还是看电视,他都不会吭声。10平方的小房子,根本间隔不开声响,所以其他人吵的话,你根本一点办法都没有。他是外公,他是家里最年长的男性,理论上他可以命令我们别吵,但是他没有这么干。

我还小的时候,如果家里只有一个小孩,我会经常缠着外公要他跟我玩。可能是玩扑克,也可能是玩其他东西。我喜欢看外公刮胡子,那是一个相当规矩的过程,整套流程都非常严谨。因为刮胡子的东西都是非常锋利的,所以整套过程,我只能看,不能动任何东西,否则外公就会发火跳起来。

小时候,我会要外公和我一起玩,带我去这里那里,买好吃好看好玩的东西。我总会围着他转,叽叽喳喳个不停,有无数多的问题。但随着年龄的增长,我几乎不跟外公说话了。因为我对他实在没什么诉求了。后来我外公的老人痴呆症越来越严重,很多东西都不记得了,其中也包括不记得身边的家人。从前那个能帮家庭做很多事的一家之主,变成了一家人都得盯着他以防他犯错的人。现在回想起来,这是一个外公走向孤独的过程。他越发不能感知身边正在发生的一切,情况就像他在时间的沙漠里走丢了,没有和我们一起上路,而我们也无法把他找回来、带身边。最后的几年,我是隐隐觉得心痛的,但是当时我心痛的不是外公还是外婆,因为那个状态的外公让外婆受很多罪。

如果可以重来,从发现症状开始,我们就不应该让时间把外公捆绑在过去,但估计连现在的医学也暂时无法解决这个难题。是生理的病把外公变成那样,但如果我们一直有人跟他说笑交流,估计情况不会这般……

2020-05
1

微软商店的什么鬼微信

By xrspook @ 18:10:42 归类于: 烂日记

不知道从什么时候开始,我发现Win10上的微信不会更新。即便手动按更新也没反应,弹出的是微软商店,但是微软商店上面的微信写的是2016年,也没有说最近的更新是什么时候,最新的版本是什么。我已经不记得这个微信我是怎么整回来的,有可能是新机自带就有这个东西,又或者是我没有在微信的官网下载,而是去了微软的商店搜索,然后下载。今天家里电脑Win7上的微信更新了新的版本。在新版本里,微信可以打开小程序了。我特意去微信的官网,看一下他们的PC微信的版本介绍到底怎么个模样。他们的官方截图用的是Win10。也就是说,最新版的微信肯定是支持Win10的。所以,我就到手提电脑里,把老的微信卸载掉,然后再从官网里下载个最新版本。让我觉得非常惊讶的是Win10下的老微信在控制面板,居然找不到,必须得在程序那里卸载。这让我觉得非常惊讶。我不知道Win10脑子里想的是什么。既然都是软件的话,为什么那些在微软商店下载的东西就不能在控制面板里控制呢?在下载之前,我先登陆那个微信,看一下之前我的文件保存在哪里,结果却发现根本没有聊天记录的保存位置,所以之前那些资料到底被放在哪里我毫不知情。同时因为版本太老,也无法控制是否自动下载文件之类的东西。我搜索了一下,有的网友说Win10下,那个在微软商店下载的微信必须得安装在C盘。幸好笔记本电脑的微信,我用得不多。我私人使用的时候根本不会打开微信,只有在临时在外工作的时候,我才会用那个微信传一下文件,所以那里没有什么非常重要的聊天记录。这本来就是我自己的电脑啊,单位没有给过我1分钱!

新版本的微信安装完以后,感觉太爽了。之前的微信窗口很小,因为手提电脑显示屏的分辨率太高,所以我设置的大小是放到125倍,但是老版本的微信经过放大以后就模糊了,所以我只能把它控制为不放大。新版本的微信已经完美支持了这个东西。新版的微信能支持缩放成系统默认的大小。显然,在中国,用Windows系统的人还是占绝大多数,而Win10是现在微软非服务器用户最主流最强推的系统。微软商店我觉得他们想把那打造成应用市场一样的东西。如果强制起来的话,甚至会强迫只能安装那里面的东西。但显然,微软商店就是个鸡肋的存在。里面的东西渣到无以言表。也许是因为他们知道自己的那个东西根本无法满足大家的需要,所以他们也不在那里投精力了,于是就出现了现在那个四不像的东西。在那里,我甚至不知道该如何控制某个软件不下载不更新也不关注。那些系统默认的全家桶全部都列在那里,看着我都觉得恶心。微软发展到今天,理论上经过这么多个版本的迭代,他们一定已经变得更强,但实际上在很多方面,他们在倒退。每当出现什么问题,他们就会把那责任推给临时工。

微信在中国乃至世界的使用量难道他们不知道吗?为什么PC微信要不断更新迭代,就是因为一直满足不了用户的需求,而微软却选择在微软商店对微信的更新视而不见。反而,给中国区的用户推送推特脸书之类的应用。他们有考虑过中国用户的感受吗?

有些大流我们随不了,但我们的大流,起码你们也适应一下。

2020-04
30

字典和递归

By xrspook @ 8:48:32 归类于: 烂日记

还记得在看微软的python入门视频的时候。我第一次接触字典这种东西。我觉得那是相当深奥的一件事,因为我搞不懂,那跟列表有什么区别,有什么牛逼的功能。之所以这样,大概是因为微软的视频里字典的录入他们用的是手动输入,显然我觉得一个一个对应太麻烦了。而且用起来的时候我也没发现有什么特别高的效率。入门终归是入门,你看不到字典的牛逼之处,当然就会对学习这东西没什么兴趣。当我在做Think Python 2习题,而且做得死去活来之后。当我用尽九牛二虎之力才终于用列表的方法以二分法搜索的方式找出某个词,而当我后来学习了字典,轻而易举就能找到某个词,效率差了一大截以后,我才明白到字典的超级牛逼之处。显然对我来说,现在我还不怎么熟悉字典这个东西。因为我只是用到了最基本的功能,还有非常多的东西我还不知道,一些它真正的用法我还没有使用到。比如现在的字典我只是停留在第一层级的程度上,通常的键和键值只是某个字符串。如果键值被换成一堆的列表呢?如果一堆列表里面还有一堆的元组呢?想想都觉得这相当恐怖,如果到达那个境界,我该用什么方法去访问那些东西呢?现在对我来说,那是个未解之谜,因为我还没遇到那种题目。

因为工作的原因,我已经放下python一两天了。这种东西一天不练就会手生,下次再重新开始的时候,大概我已经不记得某些语句该怎么写了,于是又得花一些时间去复习之前学过的东西。

还记得在接触python之前,我已经有听说有字典这种牛逼东西。在C语言里好像有,Excel VBA里好像也有,但是我都从来没有用过。因为我觉得那对我来说是非常遥远的存在。在python的学习过程中,我觉得字典就像吃饭睡觉一样,是基本的核心功能。字符串列表字典和元组就像数学里面的加减乘除。当然我这里列举了关系,并不是一一对应的,而是说明他们都是基本的功能,全部都得熟练运用。

还记得貌似是在学递归的那一章。在总结的时候,我记得那里好像说要我们学会不要在一个点上过分纠结,要有全局思维。其实递归并不需要把一个数值竟放进去,然后不断地按照程序进行不断的套用,应该从大局方面想,完成了这个操作,我应该得到什么答案,得到这个答案以后,我就可以把程序继续下去了。这说得简单,但实际上,有时我真想不到,递归最终我能得到什么答案,所以每次我都只能自己很傻地一遍一遍尝试。有些时候我图快,一下子放进去不是最基础的数字,结果就把我自己搞死了。后来才发现,原来一开始进去的东西就应该用最简单的,那才能最快地得出应该有的答案。直到现在,我还是非常难适应这种思维方式。在我没学习递归之前,我已经见识过了斐波那契数列。当时我是用循环的方法实现,但实际上更直观简单的方法是递归。还记得高中的数学里面也经常要我们把某些东西最终以某些方式表达出来,而当时他们给出的题目真是一些递归的东西。所以可能很早以前我就接触过递归了,但是当时没有学编程,也没有计算机,非常苦逼。

如果在学习的时候,能一边的学习编程一边学数学,大概当年就不会那么痛苦了。

2020-04
29

半桶水的烦恼

By xrspook @ 8:52:24 归类于: 烂日记

要实现某个功能,有非常多的做法,到底要怎么做才能避免出错呢?Excel的函数非常牛逼,把那些公式弄好了,简直就是天下无敌的节奏。公司的原理很简单,但是套用起来做着做着就傻瓜了。有可能是手贱,标点符号按错了,更大的可能性是单元格引用出错。我已经不记得用Office 2003的时候是个什么状态了。反正在Office 365下面,如果在一个工作簿里面应用了别的工作表,把带公式的工作表复制到另外一个工作簿里的时候,那些引用的单元格会以绝对地址的形式继续指向原来工作簿的某个表。显然,如果只是指向本工作簿的话,找不到地址,顶多显示错误,但是如果那东西继续指向原表,会引发很多问题。因为那是一个绝对地址,即便你把工作放在同一个文件夹下面,还是不能解决问题。恐怖的绝对地址会导致云同步、在多人协作的时候,发生状况。为什么Office 2003下就没有绝对地址和相对地址这个烦恼呢?在Office 365下,数据透视表的绝对地址算是终于改正过来了,但我想不到公式居然也这样。这是一个令人非常崩溃的事情!如果工作表里面的公式是大量的,这将是一个灭门灾难。如果某一个工作表里面的公式是大量的,而另外一个工作表里面的源数据也是大量的,外加还有一个数据透视表指向了源数据。无论是动哪一个,都会导致另外的那个上的工作推倒重来。为什么就不能设置某个工作簿里面的链接采用相对工作簿内的连接,而不使用外联呢?停止了外联,就意味着那个单元格的数据从一个动态的东西变成了静态的。绝对地址这个问题,在云同步、在多设备协作的情况之下,根本是无法操作的,为什么微软会犯如此低级的错误呢?数据透视表的傻逼是发生在Office 2010版之后的。公式上的傻逼,之前貌似我还没遇到过。可能并不是因为不存在,而纯粹是因为我没有用到这种功能。

但Excel不能一次性满足我所有想要的东西的时候,我就会想到要不要自己写个脚本解决一切难题。人想得到的逻辑,用脚本都能实现,前提是必须考虑出一种能够包容所有例外的规则。如果不能包含特殊情况,脚本写出来是毫无意义的,因为最终还是得人手去加工,这非常不科学。所以一定程度上,我更喜欢用数据透视表,自动处理那些东西,而不是手动设置公式。设置公式理论上是一个一劳永逸的过程,但实际上只要你手动在上面修改了一些东西以后,就像蝴蝶效应一样,后果不堪设想。某一次的修改,会导致往后半天都找不出原因。如果用数据透视表的话,双击单元格就会到达最基础的那个数据。查错是非常简单的,但是,用了公式以后,然后你又因为某次犯傻在某个你以为设置了公式的单元格里面输入了常数,那将导致一次令人绝望的debug。不要问我为什么会知道……

与其让我查找错误,还不如让我总结特点制定规则,让他们不犯错误。当然,不犯错误,是根本不可能的。

© 2004 - 2026 我的天 | Theme by xrspook | Power by WordPress