Python 在理解中匹配字典键元组项

Python 在理解中匹配字典键元组项,python,list-comprehension,python-3.6,Python,List Comprehension,Python 3.6,当使用扫描字典的理解表达式时, 如果我知道字典的键是简单的2项元组, 是否可以将它们“扩展”为命名变量 e、 g.如果我有: d = { ('car','blue') : 24, ('car', 'red' ): 5, ('plant', 'green'): 12, ('box','blue' ): 3 } 我知道我能行 [d[key] for key in d.keys() if key[1]=='blue'] 得到 [24, 3] 但

当使用扫描字典的理解表达式时, 如果我知道字典的键是简单的2项元组, 是否可以将它们“扩展”为命名变量

e、 g.如果我有:

d = { ('car','blue') : 24,
      ('car',    'red'  ): 5,
      ('plant',     'green'): 12,
      ('box','blue' ): 3
}
我知道我能行

[d[key] for key in d.keys() if key[1]=='blue']
得到

[24, 3]
但这失去了很多语义,我想知道我是否可以做一些更像:

[count for {(object,color):count} in d if color=='blue']
(我知道这是行不通的)。 另外,我不明白为什么最后一个表达式返回的错误是:

SyntaxError:无法分配给literal

我会选择:

[计数(对象,颜色),如果颜色='blue',则以d.items()计数]

作为最清晰的解决方案


出现错误的原因是,在使用关键字
中的
时,python试图将
d
字典中的项目分配给
{(对象,颜色):count}
,这是一种字面意思,意味着创建一个新字典。相反,使用
(对象,颜色),计数
,因为python就是这样扩展dict项的。

您不能完全做到这一点,但如果您将密钥“升级”到,您可以接近dict项。我使用“kind”作为namedtuple中第一个项的名称,因为
object
是一个内置类型,虽然我们可以在这里安全地使用它,但我认为这会让代码有点混乱

from collections import namedtuple

d = { ('car', 'blue') : 24,
      ('car', 'red'): 5,
      ('plant', 'green'): 12,
      ('box', 'blue'): 3
}

Thing = namedtuple('Thing', ('kind', 'color'))
d = {Thing(*key): count for key, count in d.items()}
print(d)

lst = [count for key, count in d.items() if key.color == 'blue']
print(lst)
lst = [count for key, count in d.items() if key.kind == 'car']
print(lst)
输出

{Thing(kind='car', color='blue'): 24, Thing(kind='car', color='red'): 5, Thing(kind='plant', color='green'): 12, Thing(kind='box', color='blue'): 3}
[24, 3]
[24, 5]

事实上,你并不真的需要有名字的情侣,尽管我认为他们会让你感觉更好一些

这是可能的。尝试:

  [d.get((object,color)) for object,color in d.keys() if color == 'blue']
这是回报

  [24, 3]

[计算(对象,颜色),如果颜色='blue',则以d.项目()计算]
[d[对象,颜色]如果颜色='blue',则以d.项目()计算]
太好了,这正是我想要的。因此,我有3个错误:1)不需要在解包所涉及的变量周围使用
{}
,2)键和值部分应该用逗号分隔,而不是冒号3)在d.items()中使用
而不是d
中的
。不需要
。获取
,因为键来自词典本身,因此可以确保它们存在于词典中。
  [24, 3]