Python 带有 try 或 if 条件的字典?
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?感谢您的回复。 'Kit' - 这是电子表格的名称
一种原始的方法:
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"),
....
}
看看 collections.defaultdict
- 它让您可以像平常一样使用字典,但是任何尝试访问不在字典中的键都会导致使用您指定的默认值创建该键.
您可以将默认值设为浮点数,默认值为 0.0,因为这是浮点数的作用,或者您可以创建一个 "magic" 值并将其用作默认值:
kit = collections.defaultdict(float)
kit = collections.defaultdict(return_some_magic_value)
不过,如果您实际上是在尝试实现电子表格,我建议您考虑一下如何处理引用其他单元格的单元格循环。这不是一个完全微不足道的问题,这个问题的答案将告诉你如何储存你的细胞。
最基本的解决方案是存储所有未解决的问题,然后遍历单元格进行 "depth-first" 评估:如果一个单元格引用另一个单元格,请解决该单元格然后返回。您会在处理单元格时将其标记为已解决,这样您的迭代和递归就不会发生冲突。一种简单的方法可能是将它们评估为一个单独的字典。您甚至可以使用 defaultdict
,其中工厂函数实际上为您进行了递归计算!
我有 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?感谢您的回复。 'Kit' - 这是电子表格的名称
一种原始的方法:
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"),
....
}
看看 collections.defaultdict
- 它让您可以像平常一样使用字典,但是任何尝试访问不在字典中的键都会导致使用您指定的默认值创建该键.
您可以将默认值设为浮点数,默认值为 0.0,因为这是浮点数的作用,或者您可以创建一个 "magic" 值并将其用作默认值:
kit = collections.defaultdict(float)
kit = collections.defaultdict(return_some_magic_value)
不过,如果您实际上是在尝试实现电子表格,我建议您考虑一下如何处理引用其他单元格的单元格循环。这不是一个完全微不足道的问题,这个问题的答案将告诉你如何储存你的细胞。
最基本的解决方案是存储所有未解决的问题,然后遍历单元格进行 "depth-first" 评估:如果一个单元格引用另一个单元格,请解决该单元格然后返回。您会在处理单元格时将其标记为已解决,这样您的迭代和递归就不会发生冲突。一种简单的方法可能是将它们评估为一个单独的字典。您甚至可以使用 defaultdict
,其中工厂函数实际上为您进行了递归计算!