<p>你的问题是你初始化了一个空的dict,没有<code>employee</code>键,所以你得到了<code>KeyError</code>:</p>
<pre><code>>>> d = {}
>>> d['employee']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'employee'
</code></pre>
<p>下一个问题是<code>employee</code>键对应的值本身应该是dict,依此类推。要解决这个问题,可以使用嵌套的<a href="https://docs.python.org/2/library/collections.html#collections.defaultdict" rel="nofollow noreferrer">^{<cd4>}</a>s</p>
<p>由于嵌套深度是恒定的和已知的,所以只需要初始化一棵树。它是列表的defaultdict的defaultdict的defaultdict:)</p>
<p>一旦这个树被初始化,就很容易将信息附加到叶子上。请注意,应该使用列表而不是元组:<code>languages</code>的长度直到最后才知道,并且不能向元组追加值。你知道吗</p>
<pre><code>data = """employee developer1 id1 language c
employee developer1 id1 language java
employee developer1 id1 worked_area delhi
employee developer1 id1 worked_area kolkata
employee developer1 id2 language python
employee developer1 id2 language c++
employee developer1 id2 worked_area kolkata
employee devloper2 id1 language c
employee devloper2 id1 language java
employee devloper2 id1 worked_area delhi
employee devloper2 id1 worked_area kolkata"""
from collections import defaultdict
tree = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: defaultdict(list))))
for line in data.splitlines():
k1, k2, k3, k4, v = line.split()
tree[k1][k2][k3][k4].append(v)
print(tree)
# defaultdict(<function <lambda> at 0x7f2e771cd7d0>, {'employee': defaultdict(<function <lambda> at 0x7f2e771cdf50>, {'developer1': defaultdict(<function <lambda> at 0x7f2e771cf050>, {'id2': defaultdict(<type 'list'>, {'worked_area': ['kolkata'], 'language': ['python', 'c++']}), 'id1': defaultdict(<type 'list'>, {'worked_area': ['delhi', 'kolkata'], 'language': ['c', 'java']})}), 'devloper2': defaultdict(<function <lambda> at 0x7f2e771cf0c8>, {'id1': defaultdict(<type 'list'>, {'worked_area': ['delhi', 'kolkata'], 'language': ['c', 'java']})})})})
print(tree['employee']['developer1']['id2']['language'])
# ['python', 'c++']
print(tree['employee']['developerX']['idX']['language'])
# []
</code></pre>
<p>要查看树的结构,可以使用<code>json.dumps</code>:</p>
<pre><code>import json
print(json.dumps(tree, indent=4))
</code></pre>
<p>它输出:</p>
<pre><code>{
"employee": {
"developer1": {
"id1": {
"language": [
"c",
"java"
],
"worked_area": [
"delhi",
"kolkata"
]
},
"id2": {
"language": [
"python",
"c++"
],
"worked_area": [
"kolkata"
]
}
},
"devloper2": {
"id1": {
"language": [
"c",
"java"
],
"worked_area": [
"delhi",
"kolkata"
]
}
}
}
}
</code></pre>
<p>因为<code>defaultdict</code>也是dict,所以您可以像建议的那样迭代这些值。你知道吗</p>