如何按照另一个列表的顺序对列表进行排序?Python

5

如果我有一个列表:

name = ['Megan', 'Harriet', 'Henry', 'Beth', 'George']

我还有另一个列表,其中每个值表示正确顺序中的名称

score_list = [9, 6, 5, 6, 10]

所以Megan = 9,Beth = 6(顺便说一下,这是从字典中得出的)

如何按字母顺序排序名称,但保持score_list与名称匹配? 我已经使用冒泡排序方法对数字进行了排序,但没有对字符串进行排序。


1
看一下zip函数。 - Benjy Kessler
当你发现自己需要这种操作时,尽管它足够简单,但请考虑使用“结构体列表”还是“列表结构体”的方式更好。 - YXD
由于这些列表来自字典,最好直接从字典构建元组列表,而不是分别提取列表,然后将它们重新压缩成元组列表。 - PM 2Ring
4个回答

6

一种显而易见的方法是同时使用zip函数对列表进行排序,然后解压缩。

>>> name, score = zip(*sorted(zip(name, score_list)))
>>> name
('Beth', 'George', 'Harriet', 'Henry', 'Megan')
>>> score
(6, 10, 6, 5, 9)

谢谢您的快速回复,但当我加载程序时,它显示“TypeError:'zip'对象不可订阅”。顺便说一下,我正在运行3.3.5 Python。 - Goregius
@Goregius,对于2022年看到这篇文章的任何人,您不应该订阅zip,而是将其转换为列表。 - thethiny

5
你可以使用 zip 同时对它们进行排序,排序方式是按名称排序:
tuples = sorted(zip(name, score_list))

然后

name, score_list = [t[0] for t in tuples], [t[1] for t in tuples]

1
如果您有一个字典,正确的方法是按键对项目进行排序:
name = ['Megan', 'Harriet', 'Henry', 'Beth', 'George']

score_list = [9, 6, 5, 6, 10]
d = dict(zip(name, score_list))

from operator import itemgetter
print(sorted(d.items(), key=itemgetter(0)))
[('Beth', 6), ('George', 10), ('Harriet', 6), ('Henry', 5), ('Megan', 9)]

1
是的,我错过了他有一个字典。 - JuniorCompressor

1
考虑一个第三方工具more_itertools.sort_together假设
import more_itertools as mit


name = ["Megan", "Harriet", "Henry", "Beth", "George"]
score_list = [9, 6, 5, 6, 10]

代码

mit.sort_together([name, score_list])
# [('Beth', 'George', 'Harriet', 'Henry', 'Megan'), (6, 10, 6, 5, 9)]

通过> pip install more_itertools安装more_itertools


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接