<p>我认为<code>nb</code>lambda的定义如下所示:</p>
<pre><code>from operator import itemgetter
Legend = {u'Conifer': 1.0, u'Hardwood': 4.0, u'Field': 5.0, u'Urban': 6.0, u'Water': 8.0}
PolyItems = {u'5423': [1.0, 2.0, 1.0, 4.0],
u'425' : [6.0, 6.0, 6.0, 6.0, 8.0, 1.0, 6.0, 1.0, 4.0, 4.0, 4.0],
u'9756': [1.0, 1.0, 4.0],
u'6418': [4.0, 8.0, 1.0, 1.0]}
nb = lambda v, c: v.count(c)
nbtot = lambda v: float(len(v))
longest_name = max(len(name) for name in Legend)
for name, cla in sorted(Legend.iteritems(), key=itemgetter(1)):
result = {id: nb(vals, cla)/nbtot(vals) * 100
for id, vals in PolyItems.items() if len(id) > 0}
print('{:<{width}}(class {}): {}'.format(name, cla, result, width=longest_name+1))
</code></pre>
<p>输出:</p>
<pre class="lang-none prettyprint-override"><code>Conifer (class 1.0): {u'9756': 66.66666666666666, u'425': 18.181818181818183, u'6418': 50.0, u'5423': 50.0}
Hardwood (class 4.0): {u'9756': 33.33333333333333, u'425': 27.27272727272727, u'6418': 25.0, u'5423': 25.0}
Field (class 5.0): {u'9756': 0.0, u'425': 0.0, u'6418': 0.0, u'5423': 0.0}
Urban (class 6.0): {u'9756': 0.0, u'425': 45.45454545454545, u'6418': 0.0, u'5423': 0.0}
Water (class 8.0): {u'9756': 0.0, u'425': 9.090909090909092, u'6418': 25.0, u'5423': 0.0}
</code></pre>
<p><strong>注意:</strong>这两个lambda函数实际上不是必需的,因为Python有执行这些操作的内置函数。这意味着可以通过省略它们来简化代码,即以下代码将产生完全相同的输出:</p>
<pre><code>longest_name = max(len(name) for name in Legend)
for name, cla in sorted(Legend.iteritems(), key=itemgetter(1)):
result = {id: vals.count(cla)/float(len(vals)) * 100
for id, vals in PolyItems.items() if len(id) > 0}
print('{:<{width}}(class {}): {}'.format(name, cla, result, width=longest_name+1))
</code></pre>