Slicing a dictionary

后端 未结 6 908
后悔当初
后悔当初 2020-12-02 10:28

I have a dictionary, and would like to pass a part of it to a function, that part being given by a list (or tuple) of keys. Like so:

# the dictionary
d = {1:         


        
6条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-02 10:56

    You should be iterating over the tuple and checking if the key is in the dict not the other way around, if you don't check if the key exists and it is not in the dict you are going to get a key error:

    print({k:d[k] for k in l if k in d})
    

    Some timings:

     {k:d[k] for k in set(d).intersection(l)}
    
    In [22]: %%timeit                        
    l = xrange(100000)
    {k:d[k] for k in l}
       ....: 
    100 loops, best of 3: 11.5 ms per loop
    
    In [23]: %%timeit                        
    l = xrange(100000)
    {k:d[k] for k in set(d).intersection(l)}
       ....: 
    10 loops, best of 3: 20.4 ms per loop
    
    In [24]: %%timeit                        
    l = xrange(100000)
    l = set(l)                              
    {key: d[key] for key in d.viewkeys() & l}
       ....: 
    10 loops, best of 3: 24.7 ms per
    
    In [25]: %%timeit                        
    
    l = xrange(100000)
    {k:d[k] for k in l if k in d}
       ....: 
    100 loops, best of 3: 17.9 ms per loop
    

    I don't see how {k:d[k] for k in l} is not readable or elegant and if all elements are in d then it is pretty efficient.

提交回复
热议问题