我有这段代码:
def magic1(text, skip):
return text[::skip]
def magic2(text, skip):
return ' '.join(text.split(' ')[::skip])
def magic3(text, appearances):
d = {}
for w in text.split(' '):
d[w] = d.get(w, 0) + 1
words = [w for w,v in d.items() if v <= appearances]
return ' '.join(words)
print magic1('abcdefghijklmnop', 2)
print magic2('hi bye doom boom', 2)
print magic3('hi bye doom boom doom bye bye', 2)
第一个函数返回字符串但跳过一个字母。 “高手...” 在第二个函数中有“''。join”,它在每个单词之间输入空格,“split”返回字符串中所有单词的列表,其中包含空格,并再次跳过。但为什么需要使用拆分和连接? 在第3个函数中,“d = {}”表示字典。再次,有分裂,字符串中的每个单词都将添加到字典中。但我不理解这一行:
words = [w for w,v in d.items() if v <= appearances]
如果外观不大于2,那么d.items中的每个w都会出现“单词”?
是的,有人能帮帮我吗? 我使用Google和文档,我只是不确定如果我理解这段代码。
感谢。
答案 0 :(得分:1)
1) “...为什么需要使用拆分和连接?”
In [1]: def magic2(text, skip):
...: return ' '.join(text.split(' ')[::skip])
...:
In [2]: print magic2('hi bye doom boom', 2)
hi doom
这是[::skip]
的关键部分。如果将其排除,则拆分和连接将相互抵消,字符串将保持不变:
In [3]: def magic2a(text, skip):
return ' '.join(text.split(' '))
...:
In [4]: print magic2a('hi bye doom boom', 2)
hi bye doom boom
但是,因为我们正在跳过.split(' ')
创建的列表中的每个第二个单词,然后加入,我们会hi doom
。
2) “......如果外观不大于2,d.items中的每个w都将出现在”单词“中?”
d = {}
for w in text.split(' '):
d[w] = d.get(w, 0) + 1
这会计算单词的数量。我们查看是否已经有d[w]
的值(如果没有,则默认为0
),然后递增。
words = [w for w,v in d.items() if v <= appearances]
然后返回小于或等于appearances
的单词列表。
对于最后一部分,使用defaultdict
可以更简单,您可以为字典中的每个键指定默认值。
from collections import defaultdict
d = defaultdict(int)
for w in text.split(' '):
d[w] += 1
答案 1 :(得分:0)
在这里计算单词数:
d = {}
for w in text.split(' '):
d[w] = d.get(w, 0) + 1
在这里
words = [w for w,v in d.items() if v <= appearances]
您返回<=
而不是appearances
(2)的单词。
在此列表中,理解w
包含一个单词,v
字典的对应值,出现次数。如果此数字小于或等于appearances
,则w
包含在理解结果中。因此,您只能使用外观小于或等于2的单词。
答案 2 :(得分:0)
这部分方法创建了一个字典,其中包含单词作为键,整数作为出现的计数器:
for w in text.split(' '):
d[w] = d.get(w, 0) + 1
所以它看起来像这样:
'bye' => 3,
'doom' => 2,
所以这一行:
words = [w for w,v in d.items() if v <= appearances]
通过字典集w迭代到字典(单词)的键,并且v为它的值(计数器)并且仅将单词放入出现更大或等于2的键:)