与蒙库特提到的类似,最好的方法之一是利用该.get()
功能。这要归功于 Charles Severance 和Python For Everyone 课程
供测试用:
# Pretend line is as follow.
# It can and does contain \n (newline) but not \t (tab).
line = """Your battle is my battle . We fight together . One team . One team .
Shining sun always comes with the rays of hope . The hope is there .
Our best days yet to come . Let the hope light the road .""".lower()
他的代码(附上我的笔记):
# make an empty dictionary
# split `line` into a list. default is to split on a space character
# etc., etc.
# iterate over the LIST of words (made from splitting the string)
counts = dict()
words = line.split()
for word in words:
counts[word] = counts.get(word,0) + 1
你的代码:
for words in word_list:
if words in word_dict.keys():
word_dict[words] += 1
else:
word_dict[words] = 1
.get()
做这个:
- 返回与 关联的字典中的 VALUE
word
。
- 否则(如果该词不是字典中的键,则返回)
0
。
无论返回什么,我们都会添加1
它。因此,它处理了第一次看到这个词的基本情况。我们不能使用字典推导,因为当我们创建该变量时,推导分配给的变量将不存在。意义
this:counts = { word:counts.get(word,0) + 1 for word in words}
是不可能的,因为counts
(同时被创建和赋值。或者,因为)counts
当我们(再次)引用它时,变量还没有完全定义.get()
。
输出
>> counts
{'.': 8,
'always': 1,
'battle': 2,
'best': 1,
'come': 1,
'comes': 1,
'days': 1,
'fight': 1,
'hope': 3,
'is': 2,
'let': 1,
'light': 1,
'my': 1,
'of': 1,
'one': 2,
'our': 1,
'rays': 1,
'road': 1,
'shining': 1,
'sun': 1,
'team': 2,
'the': 4,
'there': 1,
'to': 1,
'together': 1,
'we': 1,
'with': 1,
'yet': 1,
'your': 1}
顺便说一句,这是我写的“加载”使用,作为.get()
解决经典 FizzBuzz 问题的一种方式。我目前正在为类似情况编写代码,在这种情况下我将使用模数和字典,但将拆分字符串作为输入。