擅长:python、mysql、java
<p>一般来说,您可以使用<a href="https://docs.python.org/3.5/library/collections.html#counter-objects" rel="nofollow noreferrer">^{<cd1>}</a>将键映射到计数-它本质上是一个<a href="https://en.wikipedia.org/wiki/Multiset" rel="nofollow noreferrer">multiset</a>。在</p>
<p>因为dict是多维的,所以您需要进行一些转换,但是如果您只需迭代dict中的每个值和子值,并将其添加到<code>Counter</code>实例中,您将得到您想要的结果。在</p>
<p>这是一个第一步实现;根据<code>d</code>将包含的内容,您可能需要稍微调整一下:</p>
<pre><code>counts = Counter()
for elem in d.values():
if isinstance(obj, Iterable) and not isinstance(elem, types.StringTypes):
for sub_elem in elem:
counter.add(sub_elem)
else:
counter.add(elem)
</code></pre>
<p>注意,我们检查<code>elem</code><a href="https://stackoverflow.com/questions/1055360/how-to-tell-a-variable-is-iterable-but-not-a-string">is an iterable and not a string</a>。Python不容易区分字符串和集合,所以如果您知道<code>d</code>将只包含字符串和列表(例如),您可以简单地执行<code>isinstance(elem, list)</code>等等。如果不能保证<code>d</code>的值都是列表(或元组,等等),那么最好显式地排除字符串。在</p>
<p>另外,如果<code>d</code>可以包含递归键(例如,包含包含字符串的列表的列表),这是不够的;您可能需要编写一个递归函数来展开所有内容,就像dawg的解决方案一样。在</p>