如何在Kivy/Python中用.update()保存字典循环的全部结果到循环外
解决循环外获取所有字典生成结果的问题
你遇到的问题本质是字典的update()方法会覆盖已有键的值。每次循环中生成的data字典,键都是'1'、'2'、'3',调用datas.update(data)时,会把datas里对应键的旧值替换成当前循环的新值,所以循环结束后,datas里的每个键只保留最后一次循环的结果。
方案1:用列表存储每次循环生成的完整字典
如果需要保留每次循环生成的完整字典结构,直接把datas定义为列表,每次循环用append()添加生成的data即可:
from kivy.app import App from kivy.uix.boxlayout import BoxLayout class DataTable(BoxLayout): def __init__(self, table='', **kwargs): super().__init__(**kwargs) def build(self): # 初始化列表存储所有循环生成的字典 datas = [] for i in range(3): data = { '1': {i: 'TESTa'}, '2': {i: 'TESTb'}, '3': {i: 'TESTc'}, } datas.append(data) # 添加而非覆盖 print(datas) # 循环外输出所有结果 return datas test = build(self) class DataTableApp(App): def build(self): return DataTable() if __name__ == '__main__': DataTableApp().run()
输出结果:
[{'1': {0: 'TESTa'}, '2': {0: 'TESTb'}, '3': {0: 'TESTc'}}, {'1': {1: 'TESTa'}, '2': {1: 'TESTb'}, '3': {1: 'TESTc'}}, {'1': {2: 'TESTa'}, '2': {2: 'TESTb'}, '3': {2: 'TESTc'}}]
方案2:按键聚合所有循环结果
如果需要把每个键('1'、'2'、'3')对应的所有循环结果聚合在一起,可以初始化datas的每个键为列表,循环时将对应条目添加到列表中:
from kivy.app import App from kivy.uix.boxlayout import BoxLayout class DataTable(BoxLayout): def __init__(self, table='', **kwargs): super().__init__(**kwargs) def build(self): # 初始化每个键对应一个空列表 datas = {'1': [], '2': [], '3': []} for i in range(3): data = { '1': {i: 'TESTa'}, '2': {i: 'TESTb'}, '3': {i: 'TESTc'}, } # 将每个键的当前结果添加到对应列表 for key in datas: datas[key].append(data[key]) print(datas) return datas test = build(self) class DataTableApp(App): def build(self): return DataTable() if __name__ == '__main__': DataTableApp().run()
输出结果:
{'1': [{0: 'TESTa'}, {1: 'TESTa'}, {2: 'TESTa'}], '2': [{0: 'TESTb'}, {1: 'TESTb'}, {2: 'TESTb'}], '3': [{0: 'TESTc'}, {1: 'TESTc'}, {2: 'TESTc'}]}
内容的提问来源于stack exchange,提问作者Lod
相关产品推荐
相关产品推荐

