Python 计算类别';与dict的百分比?

Python 计算类别';与dict的百分比?,python,dictionary,lambda,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

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

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函数来进行此操作吗?有没有更好的方法来实现这一点

nb = ... if v==c]))
您正在将列表
v
nb
中的浮点值
c
进行比较,该浮点值始终返回
False
使函数为任何参数生成
0.0

我不知道该函数的用途,但我认为应将其定义为:

nb = lambda v, c: float(len([x for x in v if x==c]))
您正在将列表
v
nb
中的浮点值
c
进行比较,该浮点值始终返回
False
使函数为任何参数生成
0.0

我不知道该函数的用途,但我认为应将其定义为:

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

我认为
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))
注意:这两个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))
longest_name=max(len(name)表示图例中的名称)
对于名称,cla已排序(Legend.iteritems(),key=itemgetter(1)):
结果={id:vals.count(cla)/float(len(vals))*100
对于id,如果len(id)>0},则为PolyItems.items()中的VAL

print(“{:我认为
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))
注意:这两个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))
longest_name=max(len(name)表示图例中的名称)
对于名称,cla已排序(Legend.iteritems(),key=itemgetter(1)):
结果={id:vals.count(cla)/float(len(vals))*100
对于id,如果len(id)>0},则为PolyItems.items()中的VAL

print({:我认为你是对的。另外,float
==
比较不可靠。谢谢你。我讨厌这种情况发生。我认为你是对的。另外,float
==
比较不可靠。谢谢你。我讨厌这种情况发生。我改变了
求和(如果x==c,x代表v中的x)/c
进行正确的计算。我试图绕过使用ArcGIS/ArcPy计算流域覆盖率的需要。图例对应于地图的图例。我将一个AsciGrid转换为点,然后识别出流域多边形中的所有点并存储它们。然后每次我都需要更新e(如果网格大小和分辨率相同),我只是使用这个函数。这对于每小时变化的天气数据特别有用。@orange:是的,我弄错了,因为我碰巧主要关注的是第一个案例是
c
发生在
1.0
,所以这两个表达式给出了相同的答案。我在回答中相应地更正了这一点,并添加了一个注意你可能会发现有趣的。如果我的答案被解决或者帮助解决你的问题,请考虑投票,谢谢!我改变了<代码>和(x为x,如果x==c)/c
进行正确的计算。我试图绕过使用ArcGIS/ArcPy计算流域覆盖率的需要。图例对应于地图的图例。我将一个AsciGrid转换为点,然后识别出流域多边形中的所有点并存储它们。然后每次我都需要更新e(如果网格大小和分辨率相同),我只是使用这个函数。这对于每小时变化的天气数据特别有用。@orange:是的,我弄错了,因为我碰巧主要关注的是第一个案例是
c
发生在
1.0
,所以这两个表达式给出了相同的答案。我在回答中相应地更正了这一点,并添加了一个注意你可能会觉得有趣。如果我的答案解决或帮助解决你的问题,请考虑也投票,谢谢!