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平方的小房子,根本间隔不开声响,所以其他人吵的话,你根本一点办法都没有。他是外公,他是家里最年长的男性,理论上他可以命令我们别吵,但是他没有这么干。

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

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

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

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