<p>假设您正在从文件中逐行读取该行,只需检查该行是否以<code>:</code>结尾即可确定它是键还是值</p>
<p>当您看到一个新的键时,将其添加到dict中,并将值设置为空列表,但请保留该列表,以便在看到新值时可以继续附加到它</p>
<p>当该行不是键时,可以对其使用<code>split()</code>,并使用列表理解将项目转换为整数。您可以将它们转换为元组,以便为每个键提供一个元组列表</p>
<p>像这样的方法应该会奏效:</p>
<pre><code>result = {}
# initialize `values` to None, so you get an
# error if you see values before a key.
values = None
with open('description.txt') as f:
for line in f:
line = line.strip() # remove newline, spaces
if not line:
continue # skip blank lines
if line.endswith(':'):
# it's a key. strip the `:` and start a new list
values = []
result[line.rstrip(':')] = values
else:
values.append(tuple(int(i) for i in line.split()))
</code></pre>
<p>对于初学者来说,这段代码中的一部分可能很奇怪,那就是如何神奇地将值添加到正确的键中。这是因为Python列表是内存中的一个对象,所以将它存储在<code>values</code><em>和<code>results['peaks']</code></em>中意味着它们都指向同一个列表对象,因此添加到<code>values</code>将正确地将其添加到峰值列表中</p>
<p>列表理解的语法(这里更多的是元组理解)可能看起来也很复杂,但实际上它是一个非常Python的构造,是什么让Python如此易于使用,以及如何能够如此简洁地表达这个复杂的想法</p>
<p>在示例数据上运行此代码会产生以下结果:</p>
<pre><code>{'map': [
(39, 41)],
'hubs': [
(21, 3, 1500, 25),
(21, 38, 1500, 25)],
'peaks': [
(10, 10, 200),
(11, 10, 300),
(12, 10, 400),
(10, 11, 200),
(10, 12, 500)]}
</code></pre>
<p>我想这就是你的想法,或者至少与之相近</p>