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

时间:2017-08-02 13:16:33

标签: 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]

但这失去了很多语义,我想知道我是否能以某种方式做更多的事情:

[count for {(object,color):count} in d if color=='blue']

(我知道这不起作用)。 另外我不明白为什么最后一个表达式返回的错误是:

SyntaxError: can't assign to literal

3 个答案:

答案 0 :(得分:3)

我会选择:

[count for (object, color), count in d.items() if color == 'blue']

是最清晰的解决方案。

你得到的错误是因为当使用in关键字时,python试图将d字典中的项目分配给{(object,color):count}这是一个文字意味着创建一个新字典。相反,使用(object, color), count,因为这是python扩展dict项目的方式。

答案 1 :(得分:1)

你不能那样做,但是如果你将你的钥匙“升级”到namedtuples,你可以接近。我使用'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]

实际上,你并不真正需要 namedtuples,尽管我认为它们会让它变得更好。 ;)

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

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

答案 2 :(得分:-1)

有可能。尝试:

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

返回

  [24, 3]