Python 词典理解中的三元表达

Python 词典理解中的三元表达,python,dictionary,list-comprehension,dictionary-comprehension,Python,Dictionary,List Comprehension,Dictionary Comprehension,我想把字典翻过来。在许多键具有相同值的情况下,新键(旧值)应该和一组新值(旧键)相关联。我解决了这个问题,但我正在尝试使用字典理解和一些辅助方法进行重构 def has_unique_value(k): return d.values().count(d[k]) == 1 def keys_with_same_value_as_key(k): return set([key for key in d.keys() if d[key] == d[k]]) print( {d[k

我想把字典翻过来。在许多键具有相同值的情况下,新键(旧值)应该和一组新值(旧键)相关联。我解决了这个问题,但我正在尝试使用字典理解和一些辅助方法进行重构

def has_unique_value(k):
    return d.values().count(d[k]) == 1

def keys_with_same_value_as_key(k):
    return set([key for key in d.keys() if d[key] == d[k]])

print( {d[k]:k if has_unique_value(k) else d[k]:keys_with_same_value_as_key(k) for k in d.keys()} )
但是,这会引发语法错误

print( {d[k]:k if has_unique_value(k) else d[k]:keys_with_same_value_as_key(k) for k in d} )
                                               ^
SyntaxError: invalid syntax

希望代码中的对齐正确。它应该指向
else
子句中的第二个
。知道上面是什么吗?我已经尝试了尽可能多的括号形式。

三元表达式只能应用于一个值,而不能应用于字典赋值的等效值。请尝试以下方法:

{d[k]: k if has_unique_value(k) else keys_with_same_value_as_key(k) for k in d.keys()}
您的第一种方法类似于以下方法(不起作用):

接近

下面的代码

d = {'a': 'x', 'b': 'y', 'c': 'x'}

def has_unique_value(k):
    return d.values().count(d[k]) == 1

def keys_with_same_value_as_key(k):
    return set([key for key in d.keys() if d[key] == d[k]])

print( {d[k]:k if has_unique_value(k) else keys_with_same_value_as_key(k) for k in d.keys()} )
产生

{'y': 'b', 'x': set(['a', 'c'])}
唯一的区别是删除了第二个
d[k]:


一般来说,三元表达式如下所示

a = val_if_true if test else val_if_false
而不是你所拥有的东西:

a = val_if_true if test else a = val_if_false
您可以在开始时指定三元表达式中的值的位置


RE:评论中的问题

这仍然是一本词典

它基本上做到了以下几点:

m = {}
for k in d.keys():
    orig_key = k
    orig_val = d[k]

    if has_unique_value(k):
        m[orig_val] = orig_key
    else:
        m[orig_val] = keys_with_same_value_as_key(orig_key)

print m

唯一的区别是,在字典理解中,
m
字典没有保存在名称空间中(变量
orig\u key
orig\u val
我用来澄清代码不存在)。

这就成功了。所以整个三元表达式实际上是在计算初始的
d[k]:k
k
部分。酷!Thanks@Brad赖斯:没错。三元表达式计算在初始d[k]之后立即分配给位置的值。很高兴它有帮助。请注意,有些值是(有效的)标量,而另一些值是值集,这有点尴尬。对于唯一的情况,使用一个值的集合会更自然。@DSM是的,这是一个练习,实际上不用于任何类型的生产代码。(对我来说)这只是一个有趣的脑筋急转弯,所以从技术上讲,它仍然是一个“列表”理解。不是真的在处理一本新字典。三元表达式实际上只是分配要返回的新的
.values()
列表?它当然仍然是一个字典理解。等一下,我会编辑我的答案,试着详细说明一下。好的,是的,这就是我的旧代码的本质。对这么简单的任务来说太冗长了。所以它被称为字典理解,因为它是在构建字典,而不是列表?正如您之前所说,您不必再次指定
d[k]:
,因为您在初始
if
子句之前就这样做了。同样是的,
d[k]:
部分“接收”整个三元表达式的输出,如果不是
k
m = {}
for k in d.keys():
    orig_key = k
    orig_val = d[k]

    if has_unique_value(k):
        m[orig_val] = orig_key
    else:
        m[orig_val] = keys_with_same_value_as_key(orig_key)

print m