理解Python中的函数(split,join,dictionaries)

时间:2014-01-27 08:14:48

标签: python

我有这段代码:

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和文档我只是不确定如果我理解这段代码。 感谢。

3 个答案:

答案 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的键:)