Bra*_*ice 4 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]:k if has_unique_value(k) else d[k]:keys_with_same_value_as_key(k) for k in d.keys()} )
Run Code Online (Sandbox Code Playgroud)
但是,这会引发语法错误
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
Run Code Online (Sandbox Code Playgroud)
希望该代码中的对齐正确。它应指向第二:
,中else
条款。知道这里有什么吗?我尝试了尽可能多的括号形式。
三元表达式只能应用于一个值,而不能应用于等效的字典赋值。试试这个:
{d[k]: k if has_unique_value(k) else keys_with_same_value_as_key(k) for k in d.keys()}
Run Code Online (Sandbox Code Playgroud)
您的第一种方法类似于以下方法(不起作用):
d[k] = k if k else d[k] = None # doesn't work
Run Code Online (Sandbox Code Playgroud)
关!
以下代码
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()} )
Run Code Online (Sandbox Code Playgroud)
产生
{'y': 'b', 'x': set(['a', 'c'])}
Run Code Online (Sandbox Code Playgroud)
唯一的区别是第二个d[k]:
被删除。
通常,三元表达式看起来像
a = val_if_true if test else val_if_false
Run Code Online (Sandbox Code Playgroud)
没有比您拥有的更接近的东西:
a = val_if_true if test else a = val_if_false
Run Code Online (Sandbox Code Playgroud)
您可以指定三元表达式的值应在开始处去一次。
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
Run Code Online (Sandbox Code Playgroud)
唯一的区别是,在字典理解中,m
字典不保留在名称空间中(orig_key
并且orig_val
我用来澄清代码的变量永远不存在)。