如何在字典理解中使用if / else?

在python2.7 +存在任何方式来使像这样的东西:

{ something_if_true if condition else something_if_false for key, value in dict_.items() } 

我知道你可以做任何事情只是'如果'

 { something_if_true for key, value in dict_.items() if condition} 

你已经知道了: A if test else B是一个有效的pythonexpression式。 所示的词典理解唯一的问题是,在词典理解中的expression位置必须有两个用冒号分隔的expression式:

 { (some_key if condition else default_key):(something_if_true if condition else something_if_false) for key, value in dict_.items() } 

最后的if子句用作filter,与具有条件expression式不同。

@ Marcin的答案涵盖了这一切,但为了防止有人想看到一个实际的例子,我在下面添加两个:

假设你有以下的字典集

 d = {'key1': {'a', 'b', 'c'}, 'key2': {'foo', 'bar'}, 'key3': {'so', 'sad'}} 

并且您想要创build一个新的字典,其中的键用于指示string'a'是否包含在值中,您可以使用

 dout = {"a_in_values_of_{}".format(k) if 'a' in v else "a_not_in_values_of_{}".format(k): v for k, v in d.items()} 

这产生了

 {'a_in_values_of_key1': {'a', 'b', 'c'}, 'a_not_in_values_of_key2': {'bar', 'foo'}, 'a_not_in_values_of_key3': {'sad', 'so'}} 

现在让我们假设你有两个这样的字典

 d1 = {'bad_key1': {'a', 'b', 'c'}, 'bad_key2': {'foo', 'bar'}, 'bad_key3': {'so', 'sad'}} d2 = {'good_key1': {'foo', 'bar', 'xyz'}, 'good_key2': {'a', 'b', 'c'}} 

你想用d2的键replaced1的键,如果各个值是相同的,你可以这样做

 # here we assume that the values in d2 are unique dout2 = {d2.keys()[d2.values().index(v1)] if v1 in d2.values() else k1: v1 for k1, v1 in d1.items()} 

这使

 {'bad_key2': {'bar', 'foo'}, 'bad_key3': {'sad', 'so'}, 'good_key2': {'a', 'b', 'c'}}