两个列表根据其中一个列表

时间:2016-05-19 20:29:11

标签: python list sorting dictionary

我有一本字典:

       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在字典中映射到哈佛。

2 个答案:

答案 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)时间)。