<p>你的输入是一系列的序列。首先解析外部序列,然后解析每个项。你知道吗</p>
<p>你的外部序列是:</p>
<pre><code>Statement
<empty line>
Statement
<empty line>
...
</code></pre>
<p>假设<code>f</code>是包含数据的打开文件。阅读每个语句并返回它们的列表:</p>
<pre><code>def parseLines(f):
result = []
for line in f: # file objects iterate over text lines
if line: # line is non-empty
result.append(line)
return result
</code></pre>
<p>注意,上面的函数接受更广泛的语法:它允许在非空行之间任意多个空行,并且一行中有两个非空行。但它接受任何正确的输入。你知道吗</p>
<p>然后,您的语句是一个三元组:<code>X likes Y</code>。通过用空格分割它并检查结构来解析它。结果是一对正确的<code>(x, y)</code>。你知道吗</p>
<pre><code>def parseStatement(s):
parts = s.split() # by default, it splits by all whitespace
assert len(parts) == 3, "Syntax error: %r is not three words" % s
x, likes, y = parts # unpack the list of 3 items into varaibles
assert likes == "likes", "Syntax error: %r instead of 'likes'" % likes
return x, y
</code></pre>
<p>为每个语句列出一个对的列表:</p>
<pre><code>pairs = [parseStatement(s) for s in parseLines(f)]
</code></pre>
<p>现在需要按键对值进行分组。让我们使用<code>defaultdict</code>,它为任何新键提供默认值:</p>
<pre><code>from collections import defaultdict
the_answer = defaultdict(list) # the default value is an empty list
for key, value in pairs:
the_answer[key].append(value)
# we can append because the_answer[key] is set to an empty list on first access
</code></pre>
<p>所以这里<code>the_answer</code>是您需要的,只是它使用列表作为dict值而不是元组。这一定足够你理解你的作业了。你知道吗</p>