回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我一直在使用<a href="https://stackoverflow.com/users/1897/imran">imran</a>对<a href="https://stackoverflow.com/a/6027615/1638423">flatten nested Python dictionaries, compressing keys</a>的很好的答案,并试图想出一种方法来进一步扁平化<em>可能在<em>列表</em>中的字典<em>项的值<em><br/>
<em>(当然,由于我的数据通常来自XML,所以这也可以是递归的……</em></p>
<pre><code>from pprint import pprint
from collections import MutableMapping
def flatten(d, parent_key='', sep='_'):
items = []
for k, v in d.items():
new_key = parent_key + sep + k if parent_key else k
if isinstance(v, MutableMapping):
items.extend(flatten(v, new_key, sep=sep).items())
else:
items.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>((new_key, v))
return dict(items)
</code></pre>
<p>给出这样一个dict <code>d</code>:</p>
^{pr2}$
<p>这很有效:</p>
<pre><code>pprint(flatten(d))
{'a': 1,
'b': 2,
'c_sub-a': 'one',
'c_sub-b': 'two',
'c_sub-c': 'thre'}
</code></pre>
<p>但是,我想通过dict项的<em>列表值</em>进一步重复,并检查列表中的每个dict是否可以进一步扁平化。在</p>
<p>下面是一个使用<code>c-list</code>作为嵌套列表值的示例输入:</p>
<pre><code>d = {"a": 1,
"b": 2,
"c-list": [
{"id": 1, "nested": {"sub-a": "one", "sub-b": "two", "sub-c": "thre"} },
{"id": 2, "nested": {"sub-a": "one", "sub-b": "two", "sub-c": "thre"} },
{"id": 3, "nested": {"sub-a": "one", "sub-b": "two", "sub-c": "thre"} }]}
</code></pre>
<p>以下是我当前使用上述函数得到的结果:</p>
<pre><code>pprint(flatten(d))
{'a': 1,
'b': 2,
'c-list': [{'id': 1, 'nested': {'sub-a': 'one', 'sub-b': 'two', 'sub-c': 'thre'}},
{'id': 2, 'nested': {'sub-a': 'one', 'sub-b': 'two', 'sub-c': 'thre'}},
{'id': 3, 'nested': {'sub-a': 'one', 'sub-b': 'two', 'sub-c': 'thre'}}]}
</code></pre>
<p>下面是我要查找的输出,保留了原始<code>flatten()</code>的所有功能:</p>
<pre><code>{'a': 1,
'b': 2,
'c-list': [{'id': 1, 'nested_sub-a': 'one', 'nested_sub-b': 'two', 'nested_sub-c': 'thre'},
{'id': 2, 'nested_sub-a': 'one', 'nested_sub-b': 'two', 'nested_sub-c': 'thre'},
{'id': 3, 'nested_sub-a': 'one', 'nested_sub-b': 'two', 'nested_sub-c': 'thre'}]}
</code></pre>
<p>当dict包含列表时,我正在努力找出如何递归地将dict“重新组合”成这个。。。有什么建议吗。在</p>