<h2>理由</h2>
<p>对于每个循环,您都将覆盖到<code>failure_details_dict[test]</code></p>
<hr/>
<h2>解决方案</h2>
<p>您应该只将列表设置为一次。
<br/>您有多种选择</p>
<ul>
<li>非肾盂法(<strong>不推荐使用</strong>)</li>
</ul>
<pre class="lang-py prettyprint-override"><code>if test not in failure_details_dict:
failure_details_dict[test] = []
</code></pre>
<ul>
<li>将赋值替换为<code>dict.setdefault</code>调用。这种方式不会影响与<code>failure_details_dict</code>的其他交互</li>
</ul>
<pre class="lang-py prettyprint-override"><code>failure_details_dict.setdefault(test, []) # instead of failure_details_dict[test] = []
</code></pre>
<ul>
<li>用<code>collections.defaultdict</code>代替<code>dict</code>。这种方式将<strong>影响与<code>failure_detilas_dict</code>的其他交互</李>
</ul>
<pre class="lang-py prettyprint-override"><code>from collections import defaultdict
failure_details_dict = defaultdict(list) # instead of {}
</code></pre>
<hr/>
<h2>范例</h2>
<p>我已经重构了你的代码:</p>
<pre class="lang-py prettyprint-override"><code>all_failures = [
'test1/path/to/test1/log/failure_reason1',
'test1/path/to/test1/log/failure_reason2',
'test2/path/to/test2/log/failure_reason1',
'test2/path/to/test2/log/failure_reason2',
'test3/path/to/test3/log/failure_reason1',
'test4/path/to/test4/log/failure_reason1',
]
failure_details_dict = {}
for failure in all_failures:
key, *paths, reason = failure.split('/')
failure_details_dict.setdefault(key, []).append({
'path': f"/{'/'.join(paths)}/",
'reason': reason,
})
for key, value in failure_details_dict.items():
print(key)
print(value)
print()
</code></pre>
<hr/>
<h2>结论</h2>
<ul>
<li>如果您想要一个简单的更改,请使用<code>dict.setdefault</code>方法</李>
<li>如果对<code>failure_details_dict</code>有多个访问,并且希望每个访问都有默认值,请使用<code>collection.defaultdict</code>类</李>
</ul>
<hr/>
<h2>额外的</h2>
<blockquote>
<p>How can we modify the code so that 'path' key is copied only once and only multiple dictionaries with 'reason' key is created? In general, what would be the best way to store the data in JSON format?</p>
</blockquote>
<p>您可以重新格式化JSON,如:</p>
<pre><code>{
"test1": {
"path": "/path/to/test1/log/",
"reason": [
"failure_reason1",
"failure_reason2"
]
},
"test2": {
"path": "/path/to/test2/log/",
"reason": [
"failure_reason1",
"failure_reason2"
]
},
"test3": {
"path": "/path/to/test3/log/",
"reason": [
"failure_reason1"
]
},
"test4": {
"path": "/path/to/test4/log/",
"reason": [
"reason1"
]
}
}
</code></pre>
<p>从代码:</p>
<pre class="lang-py prettyprint-override"><code>all_failures = [
'test1/path/to/test1/log/failure_reason1',
'test1/path/to/test1/log/failure_reason2',
'test2/path/to/test2/log/failure_reason1',
'test2/path/to/test2/log/failure_reason2',
'test3/path/to/test3/log/failure_reason1',
'test4/path/to/test4/log/failure_reason1',
]
failure_details_dict = {}
for failure in all_failures:
key, *paths, reason = failure.split('/')
failure_details_dict.setdefault(key, {
'path': f"/{'/'.join(paths)}/",
'reason': [],
})['reason'].append(reason)
for key, value in failure_details_dict.items():
print(key)
print(value)
print()
</code></pre>