从另一个字典

问题描述:

创建包含特定键值对Python字典我有一些代码,看起来是这样的:从另一个字典

d = {'foo': True, 'bar': 42, 'baz': '!'} 

a = {'foo': d['foo'], 'bar': d['bar']} 
b = {'foo': d['foo'], 'baz': d['baz']} 
c = {'bar': d['bar'], 'baz': d['baz']} 

肯定有表达这个更好的方法。其实,我希望阅读文档,一个字典的copy方法接受要包含在新的字典键:

# I'd hoped that something like this would work... 
a = d.copy('foo', 'bar') 
b = d.copy('foo', 'baz') 
c = d.copy('bar', 'baz') 

我可以写一个函数用于此目的:

copydict = lambda dct, *keys: {key: dct[key] for key in keys} 

a = copydict(d, 'foo', 'bar') 
b = copydict(d, 'foo', 'baz') 
c = copydict(d, 'bar', 'baz') 

有没有更好的解决方案比以上?

+0

你为什么不使用A,B,C列表(或一组)?当你需要它时,你会冷酷地看着价值。 – maxy 2012-02-18 11:56:05

+0

实际上,我将'a','b'和'c'传递给Django的'urlencode'函数(与'urllib.urlencode'类似,它接受一个字典)。 – davidchambers 2012-02-18 11:58:37

+0

@BlaXpirit:你应该写一个只包含“否”的答案。 (用HTML注释填充到最小大小),这样我们都可以疯狂地投票。 – 2012-02-18 12:01:41

我想,在这个问题的功能是最好的解决方案。

当然,有人可能会张贴一些惯用的代码,但我敢肯定它不会工作更好/更快。在列表中迭代并通过键从字典中获取项目的速度尽可能快。

一个建议是请从keys参数的明星。参数解包会增加不必要的开销。将这些键作为元组传递应该没有问题。

正如@BlaXpirit指出,这种解决方案可能不会成为比你更好的速度和可读性方面,但你可以做这样的事情:

>>> from operator import itemgetter 
>>> d = {'foo': True, 'bar': 42, 'baz': '!'} 
>>> keys = ['foo', 'bar'] 
>>> dict(zip(keys, itemgetter(*keys)(d))) 
{'bar': 42, 'foo': True} 

唯一改善我会提出的是,使用一个真正的函数定义,而不是一个拉姆达:

def copy_dict(d, *keys): 
    """Make a copy of only the `keys` from dictionary `d`.""" 
    return {key: d[key] for key in keys} 

这可能是应对丢失的钥匙是有用的,但在Python 2不能很好地,拌入* ARGS可选关键字参数,所以你可能必须去一个元组的说法:

def copy_dict(d, keys, default=None): 
    """Make a copy of only the `keys` from dictionary `d`. 

    Use `default` if a key is missing. 

    """ 
    return {key: d.get(key, default) for key in keys}