如何检查字典是否在字典的键和值列表中,字典可以嵌套在字典的列表中?

时间:2019-01-28 19:54:54

标签: python python-3.x dictionary-comprehension

我要检查字典列表中是否存在整个字典(键和值)。每个字典可以是字典和列表的嵌套字典。

当我有很多标量要检查每个标量是否存在于标量的目标列表中时,我通常将目标列表放入集合中并检查集合中的存在,例如scalar in set(list_of_scalars)。 (请让我知道这是否不是执行此操作的最佳方法)

对于字典,我不能做my_dict in set(list_of_dicts),因为这样会引起unhashable type: 'dict'

如果存在相同的键名但值不同(我想要的是),那么执行my_dict in list_of_dicts似乎可以正确返回False,但是我担心运行时; python内部优化吗?我还能做什么?

编辑:假设我将执行许多查找,并使用Python3.7

2 个答案:

答案 0 :(得分:3)

  

要检查标量列表中是否存在标量,通常将列表放入集合中并检查集合中的存在,例如set(list_of_scalars)中的标量。 (请让我知道这是否不是执行此操作的最佳方法)

集合的创建将是O(n)操作。该集合中的每个后续查找将是O(1)平均情况,因此,如果您计划执行多次查找,则值得。否则,如果仅执行一次查找,则最好在列表中执行线性搜索(假设其未排序)。

  

对于字典,我无法在set(list_of_dicts)中执行my_dict,因为   引发不可散列的类型:“ dict”。但是list_of_dicts中的my_dict运行   很好,但是我担心运行时;

如果您需要重复执行此查找,则根据存储在这些词典中的内容的性质,您可能需要重新考虑使用词典,而是选择对象。然后,您可以为对象定义def weekday_job(x, t=None): week = datetime.today().weekday() if t is not None and week < 5: schedule.every().day.at(t).do(x) weekday_job(main, '01:00') weekday_job(main, '02:00') while True: schedule.run_pending() time.sleep(60) 方法并将它们存储在一组中,查找将变得更加容易。

  

python是否在内部进行优化?我还能做什么?

您可以在此处查看使用Python数据结构进行操作的时间复杂度:TimeComplexity。 Python无法优化通用列表中的通用搜索,它将使用线性搜索行为(O(n))。

答案 1 :(得分:0)

要优化多个查找,您可以create a hashable dictionary class并搜索一组可哈希的字典:

l = [{1:2,3:4}, {5:6,7:8}]
setofdicts = set(map(hashabledict, l))
hashabledict({5:6,7:8}) in setofdicts
#True