用dict计算班级的百分比?

2024-09-28 01:25:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有点困在这里,好像错过了什么。我需要计算一个图例的每一类相对于所列元素的词汇表的百分比。以下是我的内容:

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


Tags: lambda函数inidforleniffloat
2条回答
nb = ... if v==c]))

您正在将一个列表vnb中的一个浮点值c进行比较,该浮点值总是返回False,使函数为任何参数生成0.0。你知道吗

我不知道这个函数是用来做什么的,但我认为它应该被定义为:

nb = lambda v, c: float(len([x for x in v if x==c]))

我认为nblambda的定义如下所示:

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}

注意:这两个lambda函数实际上不是必需的,因为Python有执行这些操作的内置函数。这意味着可以通过省略它们来简化代码,即以下代码将产生完全相同的输出:

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))

相关问题 更多 >

    热门问题