Saya memiliki kamus nama negara, untuk setiap negara saya telah menyimpan nilai numerik dan tag. nilai numerik adalah frekuensi sederhana yang saya berikan ke pygal Worldmap dan tagnya adalah string yang ingin saya tambahkan ke tooltip.

Misalnya negara 'af' dan 'cn' memiliki nilai numerik yang sesuai 20 dan 10, dan tag 'AA' dan 'BB'. Kemudian kode di bawah ini berfungsi dengan baik.

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'}])

Tetapi jika saya membuat daftar seperti ini

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

Dan berikan ke fungsi di atas seperti ini

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

Itu tidak memberi saya hal yang sama! kedua tooltips sekarang menunjukkan tag yang sama BB yang sesuai dengan elemen terakhir di countries.

Sebenarnya saya memiliki puluhan negara dan dengan kode terakhir, tooltips semuanya sama dan mereka adalah tag untuk negara terakhir. tetapi kode pertama di atas berfungsi dengan baik dan saya bertanya-tanya bagaimana saya bisa membuatnya dengan benar.

0
Amir Naseri 12 Mei 2021, 02:03

1 menjawab

Jawaban Terbaik

Variabel i berubah. Anda tidak memanggil fungsi formatter sampai nanti, di mana titik i sudah menunjuk ke elemen terakhir dari for loop. Jika Anda dapat memanggil pemformat langsung setelah menyelesaikan elemen pertama dan sebelum melanjutkan ke elemen kedua, Anda akan mendapatkan AA. Yang perlu Anda lakukan adalah mengikat i['tag'] ke parameter lambda - tag=i["tag"] sehingga nilainya sendiri akan disimpan.

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

Apa yang dicetaknya adalah:

5: 3AA
5: 3AA
1
BoobyTrap 12 Mei 2021, 01:41