我有点卡在这里,似乎我错过了什么。我需要计算一个传奇的每个类别在列出的元素的词典上的百分比。这是我的内容:
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]}
现在,我试图对Legend变量进行循环并使用lambda函数计算每个类的百分比,但我总是为每个项目获得0.0
。
nb = lambda v, c: float(len([x for x in v if v==c]))
nbtot = lambda v: float(len(v))
for name, cla in Legend.iteritems():
result = {id: nb(vals, cla)/nbtot(vals) * 100
for id, vals in PolyItems.items() if len(id) > 0}
我可以使用lambda函数吗?有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
nb = ... if v==c]))
您正在将列表v
与c
中的浮点值nb
进行比较,该值始终返回False
,使得该函数为任何参数生成0.0
。
我不知道该功能的用途,但我认为应将其定义为:
nb = lambda v, c: float(len([x for x in v if x==c]))
答案 1 :(得分:1)
我认为nb
lambda应该如下所示定义:
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))
输出:
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}
注意:由于Python具有执行这些操作的内置函数,因此这两个lambda函数并不是必需的。这意味着可以通过省略代码来简化代码 - 即。以下代码将产生完全相同的输出:
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))