我有一本字典:
d = {'Dartmouth': 'Peter Smith',
'Harvard': 'Karen Samuels',
'Stanford': 'Sam Peters',
'UCLA': 'Frank Holland',
'Brown': 'Michelle Lee}
假设我有一个名为orderList(list)
的函数,它接收学生姓名列表并对其进行排序(无论其排序方式如何)。
如果我从字典的值中创建一个列表并将其传递给orderList,即
orderList(['Peter Smith', 'Karen Samuels', 'Sam Peters', 'Frank Holland', 'Michelle Lee']
)
它返回:
['Karen Samuels', 'Sam Peters', 'Michelle Lee', 'Peter Smith', 'Frank Holland']
如何让字典中的相应键与orderList输出的顺序相同?即如果我把钥匙拿到列表中,它应该是这样的:
['Harvard', 'Stanford', 'Brown', 'Dartmouth', 'UCLA']
所以,例如,哈佛应该先行,因为Karen Samuels在返回列表中排名第一,Karen Samuels在字典中映射到哈佛。
答案 0 :(得分:2)
所以你基本上想要"反转"字典中的键值对? 这很容易:
new_dict = {v:k for k, v in old_dict.items()}
output = {(expression 1):(expression 2) for (expression 3) in (expression 4)}
是一个词典理解;并等同于
output = {}
for (expression 3) in (expression 4):
output[(expression 1)] = (expression 2)
然后只使用它:
inverted_dictionary = {v:k for k, v in original_dictionary.items()}
out = [inverted_dictionary[i] for i in orderList(original_list))
这是列表理解,与dict理解类似:
output = [(expression 1) for (expression 2) in (expression 3)
将获得
output = []
for (expression 2) in (expression 3):
output.append((expression1))
(虽然dict理解中的(表达式3)和列表推导中的(表达式2)是有效的表达式,但并非所有有效的表达式都会在这个地方产生有效的结果。(表达式3)必须是一个名字元组( ",".join(names)
);如果需要,在逗号周围添加空格
答案 1 :(得分:-1)
您可以创建反向查找表,然后对新订单中每个值的键进行查找:
>>> d = {'Dartmouth': 'Peter Smith',
'Harvard': 'Karen Samuels',
'Stanford': 'Sam Peters',
'UCLA': 'Frank Holland',
'Brown': 'Michelle Lee'}
>>> dinv = {v: k for k,v in d.items()}
>>> order = ['Karen Samuels', 'Sam Peters', 'Michelle Lee', 'Peter Smith', 'Frank Holland']
>>> [dinv[v] for v in order]
输出:
['Harvard', 'Stanford', 'Brown', 'Dartmouth', 'UCLA']
你想要像我们在这里做的那样提前创建查找表(O(n)额外内存和O(n)时间),而不是扫描每个值的键:值对(O(n ^ 2)时间)。