【问题标题】:Check if a float number is in a dictionary key in Python检查浮点数是否在 Python 的字典键中
【发布时间】:2020-07-05 04:25:37
【问题描述】:

我有这样的字典 tmp_dic = {'0.0': 'val0', '1': 'val1', 'key3': 'val2'} 。现在在解析文件期间,我想检查例如浮点值是否可以说 1.0 在 tmp_dic 键中?我有这样一个简单的逻辑,但似乎有时会返回错误的答案。

str(int(1.0)) in tmp_dic.keys()

在检查数字字符串是否存在于键中之前,我是否需要检查它们是整数还是浮点数? 感谢您的提示。

【问题讨论】:

  • 这取决于您是否希望将浮点数和整数字符串表示视为相等?
  • “有时回答错误”到底是什么意思?附言而不是使用in tmp_dic.keys(),而是使用in tmp_dic,它做同样的事情但效率更高。

标签: python python-3.x dictionary


【解决方案1】:

你可以使用:

def gen_float(l):
    for f in l:
        try:
            yield float(f)
        except ValueError:
            pass
any(v == 1.00 for v in gen_float(tmp_dic.keys()))

输出:

True

例如,将您的键转换为浮点数比将检查浮点数转换为int 比转换为字符串更好。如果您的支票浮动是1.23,这将转换为1


或者你可以使用:

1.0 in gen_float(tmp_dic.keys())

正如@HeapOverflow 建议的那样


如果在创建 tmp_dict 时尝试将键转换为浮点数会更好,而不是在 dict 中搜索 float 将是 O(1) 时间复杂度


如果你没有像'1.0000' 这样的字符串,你也可以使用:

str(1.0) in tmp_dict or str(int(1.0)) in tmp_dict

【讨论】:

  • 首先对字典进行线性搜索就违背了使用字典的目的。
  • @MarkRansom OP 可能有 '1.00' 或 '1.00000' 在这种情况下线性方法是一种很好的方法
  • 不,线性不是一个好方法,它很慢。如果这就是您想要做的,那么拥有list 的键值对会更有效率。更好的方法是使键的格式一致,以便等效键始终匹配。
  • P.S.使用浮点数作为字典键也不是一个好主意,请参阅stackoverflow.com/q/588004/5987
  • 我很确定 OP 没有这种极端情况,如我所见,更多的是小数点后 1,但 OP 可能会澄清
猜你喜欢
  • 2018-03-04
  • 1970-01-01
  • 2017-06-23
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 2014-08-17
  • 2021-02-28
相关资源
最近更新 更多