<p>考虑</p>
<pre><code>from collections import Counter
cnt = Counter(lst)
print {gender: {name: cnt[name] for name in persons if persons[name] == gender}
for gender in set(persons.values())}
# {'Eunuch': {'Varys': 1},
# 'Male': {'Tyrion': 3, 'Hodor': 2, 'Theon': 0},
# 'Female': {'Daenerys': 2, 'Arya': 1, 'Sansa': 0}}
</code></pre>
<p>要计算百分比,让我们添加一个helper函数:</p>
^{pr2}$
<p>然后呢</p>
<pre><code>print {gender: percentage_dict({name: cnt[name] for name in persons if persons[name] == gender})
for gender in set(persons.values())}
# {'Eunuch': {'Varys': 100.0}, 'Male': {'Hodor': 40.0, 'Theon': 0.0, 'Tyrion': 60.0}, 'Female': {'Daenerys': 66.66666666666667, 'Arya': 33.333333333333336, 'Sansa': 0.0}}
</code></pre>
<p>下面是如何使用helper函数更有效地编写此理解:</p>
<pre><code>def invert(d):
"""Turn {a:x, b:x} into {x:[a,b]}"""
r = {}
for k, v in d.items():
r.setdefault(v, []).append(k)
return r
</code></pre>
<p>然后呢</p>
<pre><code>cnt = Counter(lst)
print {gender: {name: cnt[name] for name in names}
for gender, names in invert(persons).items()}
</code></pre>
<p>排除总和为零的子曲面的步骤</p>
<pre><code>print {gender: {name: cnt[name] for name in names}
for gender, names in invert(persons).items()
if any(cnt[name] for name in names)
}
</code></pre>