我有一个字典,并且想把其中的一部分通过键的列表(或元组)传递给一个函数,就像这样:
# the dictionary
d = {1:2, 3:4, 5:6, 7:8}
# the subset of keys I'm interested in
l = (1,5)
现在,理想情况下我希望能够做到这一点:
>>> d[l]
{1:2, 5:6}
...但这并不奏效,因为它会查找与元组(1,5)
相匹配的键,与d[1,5]
相同。
d{1,5}
甚至不是有效的Python代码(就我所知...),尽管它可能很方便:花括号暗示了一个无序集合或字典,因此返回一个包含指定键的字典对我来说看起来非常合理。
d[{1,5}]
也有意义(“这里有一组键,给我匹配的项”),而且{1, 5}
是一个不可哈希的集合,因此没有与之匹配的键 -- 但是当然它也会抛出一个错误。
我知道我可以这样做:
>>> dict([(key, value) for key,value in d.iteritems() if key in l])
{1: 2, 5: 6}
或者这样:
>>> dict([(key, d[key]) for key in l])
哪一种更紧凑,但我感觉一定有一种“更好”的方法来做到这一点。我是不是错过了一种更优雅的解决方案?
(我正在使用Python 2.7)
d[*l]
,但当然那行不通。 - Ken Williamsd[1, 5]
只有在d
是列表时才有效,而不是字典。除非当然你的字典中有一个键为(1, 5)
的项:使用上述定义的d
,你会得到一个键错误。但如果你将其定义为dt = {1: 2, 3: 4, 5: 6, (1, 5): 15}
,它可以很好地工作并产生15
-- 但这绝对不是我想要的。目标是提供一个键的列表/元组/集合,并获取所有匹配的项。字典本质上是键/值对的集合。特别是自 Python 3.9 终于引入了 union 运算符后,交集和排除似乎是显而易见的补充。 - Zak