计算班级' dict的百分比?

时间:2017-05-01 21:18:54

标签: python dictionary lambda

我有点卡在这里,似乎我错过了什么。我需要计算一个传奇的每个类别在列出的元素的词典上的百分比。这是我的内容:

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函数吗?有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

nb = ... if v==c]))

您正在将列表vc中的浮点值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))