以下函数返回输入字典的反转,其中原始字典的值用作返回字典的键,原始字典的键用作返回字典的值:
def lower(d):
return dict((k.lower(), [item.lower() for item in v]) for k, v in d.iteritems())
def reverse_dictionary(input_dict):
D=lower(input_dict)
reverse_dict = {}
for key, value in D.iteritems():
if not isinstance(value, (list, tuple)):
value = [value]
for val in value:
reverse_dict[val] = reverse_dict.get(val, [])
reverse_dict[val].append(key)
for key, value in reverse_dict.iteritems():
if len(value) == 1:
reverse_dict[key] = value[0]
return reverse_dict
input_dict= {'astute': ['Smart', 'clever', 'talented'],
'Accurate': ['exact', 'precise'],
'exact': ['precise'], 'talented': ['smart', 'keen', 'Bright'],
'smart': ['clever', 'bright', 'talented']}
print(reverse_dictionary(input_dict))
但是返回的字典中的值列表没有按升序排序。
此函数返回:
{'precise': ['accurate', 'exact'], 'clever': ['astute', 'smart'], 'talented': ['astute', 'smart'], 'keen': 'talented', 'bright': ['talented', 'smart'], 'exact': 'accurate', 'smart': ['astute', 'talented']}
正确的输出是:
{'precise': ['accurate', 'exact'], 'clever': ['astute', 'smart'], 'talented': ['astute', 'smart'], 'keen': ['talented'], 'bright': ['smart', 'talented'], 'exact': ['accurate'], 'smart': ['astute', 'talented']}
任何帮助将不胜感激。
答案 0 :(得分:1)
reverse_dict
只是一个普通的旧词典,不保留向其添加元素的顺序,使整个方法毫无意义。相反,如果您希望保留插入顺序,则应在初始化此变量时使用OrderedDict
模块中的collections
(from collections import OrderedDict
):
reverse_dict = OrderedDict();
答案 1 :(得分:0)
您可以直接遍历排序的(键,值)对:
for key, value in sorted(D.iteritems()):
...
或者在构建反向字典后对值进行排序:
for key, value in reverse_dict.iteritems():
value.sort()
...
答案 2 :(得分:0)
如果要对值列表进行排序,则需要明确地进行排序。
这应该有效:
def reverse_dictionary(input_dict):
D=lower(input_dict)
reverse_dict = {}
for key, value in D.iteritems():
if not isinstance(value, (list, tuple)):
value = [value]
for val in value:
reverse_dict[val] = reverse_dict.get(val, [])
reverse_dict[val].append(key)
for key, value in reverse_dict.iteritems():
if len(value) > 1:
reverse_dict[key] = sorted(value)