6

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

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知道这里有什么吗?我已经尝试了尽可能多的括号形式。

4

2 回答 2

7

关!

以下代码

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

您在开始时指定三元表达式中的值应该去哪里一次。


回复:评论中的问题

这仍然是绝对的字典理解。

它基本上是在做以下事情:

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_key和我从来没有存在过)。orig_val

于 2014-01-18T20:27:29.417 回答
6

三元表达式只能应用于一个值,而不能应用于字典赋值的等价物。试试这个:

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

您的第一种方法类似于以下方法(不起作用):

d[k] = k if k else d[k] = None  # doesn't work
于 2014-01-18T20:25:04.963 回答