在 pygal 世界地图中生成值格式化程序的 Python 问题

A Python issue with generating value formatters in pygal Worldmaps

我有一本国家名称字典,我为每个国家存储了一个数值和一个标签。数值是我传递给 pygal Worldmap 的简单频率,标签是我想添加到工具提示的字符串。

例如假设国家'af'和'cn'有对应的数值20和10,标签'AA'和'BB'。那么下面的代码就可以正常工作了。

import pygal
worldmap_chart = pygal.maps.world.World()

worldmap_chart.add('2012', [{'value': ('af',20), 
                              'formatter': lambda x: '{}: {}'.format(x[0], x[1]) + 'AA'},
                            {'value': ('cn',10), 
                              'formatter': lambda x: '{}: {}'.format(x[0], x[1]) + 'BB'}])

但是如果我创建一个这样的列表

countries=[{'value': ('af',20), 'tag':'AA'}, {'value': ('cn',10), 'tag':'BB'}]

然后像这样传递给上面的函数

worldmap_chart.add('2012', [{'value': i['value'], 
                      'formatter': lambda x: '{}: {}'.format(x[0], x[1]) + i['tag']} for i in countries])

它没有给我同样的东西!两个工具提示现在都显示与 countries.

中最后一个元素相对应的相同标记 BB

其实我有几十个国家和最后一个代码,工具提示都是一样的,它们是最后一个国家的标签。但是顶部的第一个代码工作正常,我想知道如何才能正确生成它们。

变量i正在改变。您直到稍后才调用 formatter 函数,此时 i 已经指向 for 循环的最后一个元素。如果您可以在完成第一个元素之后和继续第二个元素之前直接调用格式化程序,您将得到 AA。 您需要做的是将 i['tag'] 绑定到 lambda 的参数 - tag=i["tag"] 以便保存值本身。

def main():
    countries=[{'value': ('af',20), 'tag': 'AA'}, 
               {'value': ('cn',10), 'tag': 'BB'}]
    regular = [{'value': ('af',20), 'formatter': lambda x: f'{x[0]}: {x[1]}AA'},
               {'value': ('cn',10), 'formatter': lambda x: f'{x[0]}: {x[1]}BB'}]
    generated = [{'value': i['value'],
                  'formatter':
                      lambda x, tag=i["tag"]:
                      f'{x[0]}: {x[1]}{tag}'} for i in countries]

    print(regular[0]['formatter']((5, 3)))
    print(generated[0]['formatter']((5, 3)))


if __name__ == '__main__':
    main()

它打印的是:

5: 3AA
5: 3AA