[英]Python dictionary with try or if condition?
我有这样的python字典:
bla = {
"ab_1A": str(round(kit['a8'].value,2)),
"bc_2A": str(round(kit['a14'].value,2)),
"ca3_A": str(round(kit['a35'].value,2)),
"4A_1": str(round(kit['a51'].value,2)),
....
}
我从.xls文件中读取单元格。 有没有什么好主意,例如检查。 a8存在并且没有NoneType,如果存在,则输入0? 感谢您的回购。 “工具包”-这是电子表格的名称
一种原始的方法:
def default_cell(xl_obj, cell, default_val):
try:
return str(round(xl_obj[cell].value,2))
except: #best if you can narrow down the exception...
return default_val
kit = {
"1A": default_cell('a8', "0.00"),
"2A": default_cell('a9', "0.00"),
....
}
在Python中,寻求宽容比获得许可要容易 。
看一下collections.defaultdict
它让您像普通的那样使用字典,但是任何尝试访问不在字典中的键的操作都会使该键使用您指定的默认值创建。
您可以将默认值设置为浮点数,默认值为0.0,因为这就是浮点数的作用,也可以创建一个“魔术”值并将其用作默认值:
kit = collections.defaultdict(float)
kit = collections.defaultdict(return_some_magic_value)
但是,如果您实际上是在尝试实现电子表格,则建议您考虑如何处理引用其他单元格的单元格循环。 这不是一个完全无关紧要的问题,该问题的答案将告诉您如何存储单元格。
最基本的解决方案是存储所有未解析的内容,然后遍历单元格进行“深度优先”评估:如果一个单元格引用了另一个单元格,请解析该单元格然后返回。 您将在执行操作时将单元标记为已解析,以便您的迭代和递归不会冲突。 一种简单的方法可能是将它们评估为单独的字典。 您甚至可以在工厂函数实际为您进行递归评估的地方使用defaultdict
!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.