[英]How do I reverse this dictionary in the format given?
我想将其转换为:
d={'move': ['liikuttaa'], 'hide': ['piilottaa', 'salata'], 'six': ['kuusi'], 'fir': ['kuusi']}
到这个:
{'liikuttaa': ['move'], 'piilottaa': ['hide'], 'salata': ['hide'], 'kuusi': ['six', 'fir']}
基本上颠倒了这本字典。 同样,新字典的值应采用列表形式,如图所示。
我已经尝试使用zip函数,通过(v,k)进行反转,但是每次遇到相同的错误:“无法哈希的类型列表”。
def reverse_dictionary(d):
reverse=list(zip(d.values(),d.keys()))
return reverse
输出应为:
{'liikuttaa': ['move'], 'piilottaa': ['hide'], 'salata': ['hide'], 'kuusi': ['six', 'fir']}
您可以将defaultdict
与list
一起使用:
from collections import defaultdict
from pprint import pprint
d = {'move': ['liikuttaa'],
'hide': ['piilottaa', 'salata'],
'six': ['kuusi'],
'fir': ['kuusi']}
result = defaultdict(list)
for key, values in d.items():
for value in values:
result[value].append(key)
pprint(dict(result))
输出:
{'kuusi': ['fir', 'six'],
'liikuttaa': ['move'],
'piilottaa': ['hide'],
'salata': ['hide']}
或者您可以将普通dict
与setdefault
:
result = {}
for key, values in d.items():
for value in values:
result.setdefault(value, []).append(key)
我将首先创建一个生成器,该生成器在现有字典中生成键,值对:
def pairs(d):
for key in d:
for value in d[key]:
yield key, value
然后使用defaultdict创建反向结构:
from collections import defaultdict
reversed_d = defaultdict(list)
for key, value in pairs(d):
reversed_d[value].append(key)
嵌套列表推导将执行以下操作:
{vv: k for k, v in d.items() for vv in v}
编辑
我误会了你的要求。 这个更好:
from collections import defaultdict
new_dict = defaultdict(list)
for k, v in d.items()
for val in v:
new_dict[k].append(v)
这并不简单,字典可逆。 您还需要访问/创建内部列表并相应地填充内部列表(同时避免在生成的字典上发生键冲突)。
一种方法是:
def reverse_dict_special(d):
result = {}
for k, vs in d.items():
for v in vs:
if v in result:
result[v].append(k)
else:
result[v] = [k]
return result
d = {'move': ['liikuttaa'], 'hide': ['piilottaa', 'salata'], 'six': ['kuusi'], 'fir': ['kuusi']}
reverse_dict_special(d)
# {'liikuttaa': ['move'],
# 'piilottaa': ['hide'],
# 'salata': ['hide'],
# 'kuusi': ['six', 'fir']}
请注意,这不需要使用dict.setdefault()
建议的collections.defaultdict
或dict.setdefault()
。 实际上,所提出的方法似乎比其他两个方法都能更快地得到结果:
from collections import defaultdict
def reverse_dict_special2(d):
result = defaultdict(list)
for key, values in d.items():
for value in values:
result[value].append(key)
return result
def reverse_dict_special3(d):
result = {}
for key, values in d.items():
for value in values:
result.setdefault(value, []).append(key)
return result
%timeit reverse_dict_special(d)
# 1.22 µs ± 29.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit reverse_dict_special2(d)
# 2.04 µs ± 44 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit reverse_dict_special3(d)
# 1.55 µs ± 18.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
( 编辑 :起初我误解了这个问题,并且没有意识到输入的内部列表可能有多个项目)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.