代码之家  ›  专栏  ›  技术社区  ›  Batman

检查字典中是否所有值都作为键存在

  •  5
  • Batman  · 技术社区  · 8 年前

    我有一份价值观清单和一本字典。我想确保列表中的每个值都作为字典中的键存在。目前,我使用两个集合来确定字典中是否不存在任何值

    unmapped = set(foo) - set(bar.keys())
    

    有没有更像蟒蛇的方法来测试这个呢?感觉有点像黑客?

    2 回复  |  直到 8 年前
        1
  •  2
  •   user3483203    8 年前

    您的方法将起作用,但是,从转换到 set .

    另一个具有相同时间复杂性的解决方案是:

    all(i in bar for i in foo)
    

    两者都有时间复杂性 O(len(foo))

    bar = {str(i): i for i in range(100000)}
    foo = [str(i) for i in range(1, 10000, 2)]
    
    %timeit all(i in bar for i in foo)
    462 µs ± 14.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    %timeit set(foo) - set(bar)
    14.6 ms ± 174 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    # The overhead is all the difference here:
    
    foo = set(foo)
    bar = set(bar)
    
    %timeit foo - bar
    213 µs ± 1.48 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    

    这里的开销很大,所以我会选择 all 在这里。

        2
  •  1
  •   Abhijith Asokan    8 年前

    试试看是否有任何未映射的项:

    has_unmapped = all( (x in bar) for x in foo   )
    

    要查看未映射的项:

    unmapped_items = [ x for x in foo if x not in bar ]