基本 Python:对列表中的项目进行排名
Basic Python: Rank items in list
我有一个列表:
[55, 41, 45, 43, 60, 47, 33, 70, 42, 42, 44]
我想创建一个新列表,按照它们的顺序排列这些项目:
预期输出:
[7, ,2 ,9 ,10, 4, 11, 3, 6, 1, 5, 8]
尝试了这 3 个版本的 func 但它不能正常工作,不知道为什么?
def argsort(seq):
#return sorted(range(len(seq)), key = seq.__getitem__)
#return [i for (v, i) in sorted((v, i) for (i, v) in enumerate(seq))]
return [x for x,y in sorted(enumerate(seq), key = lambda x: x[1])]
returns:
[6, 1, 8, 9, 3, 10, 2, 5, 0, 4, 7]
让我们对您的追求做出更精确的定义:
Given a list L of numbers, create a list M that contains the valid indices of L, such that M[i]
is the index at which the i
th element of L occurs, when sorted. Present M
as if the first element of L occurs at index 1.
现在,列表的有效索引有两种方式:
range(len(L))
: 给出一个数字序列 0...len(L)-1
enumerate(L)
:给出一个元组序列(0, L[0])... (len(L)-1, L[len(L)-1])
由于您想在列表索引从 1 开始的假设下操作(实际上它们在 python 中从 0 开始),我们需要做一些偏移设置
range(len(L))
变成 `range(1, len(L)+1)
enumerate(L)
变为 enumerate(L, 1)
(可选参数告诉 enumerate
从 1 开始编号)
因为我们也需要列表项,所以我们使用 enumerate
,而不是使用 range
并进行查找(我个人更喜欢这种方法,虽然两者都有效)
所以现在,我们可以得到一个元组列表,其中每个元组包含L中的一个元素的索引和L中对应的元素。我们需要根据元素本身对其进行排序。这可以通过调用 sorted
来完成,可选的 key
参数说明我们应该按元组的第二个元素排序(operator.itemgetter(1)
就是这样说的)。
一旦我们有了这样的元组的排序列表,我们需要做的就是提取每个元组的第一个元素(L 中的索引),我们可以使用列表推导 [i[0] for i in mylist]
,或者等价地[operator.itemgetter(0)(t) for t in mylist]
将所有这些元素放在一起,我们得到以下内容
In [138]: L = [55, 41, 45, 43, 60, 47, 33, 70, 42, 42, 44]
In [139]: [operator.itemgetter(0)(t) for t in sorted(enumerate(L,1), key=operator.itemgetter(1))]
Out[139]: [7, 2, 9, 10, 4, 11, 3, 6, 1, 5, 8]
我有一个列表:
[55, 41, 45, 43, 60, 47, 33, 70, 42, 42, 44]
我想创建一个新列表,按照它们的顺序排列这些项目:
预期输出:
[7, ,2 ,9 ,10, 4, 11, 3, 6, 1, 5, 8]
尝试了这 3 个版本的 func 但它不能正常工作,不知道为什么?
def argsort(seq):
#return sorted(range(len(seq)), key = seq.__getitem__)
#return [i for (v, i) in sorted((v, i) for (i, v) in enumerate(seq))]
return [x for x,y in sorted(enumerate(seq), key = lambda x: x[1])]
returns:
[6, 1, 8, 9, 3, 10, 2, 5, 0, 4, 7]
让我们对您的追求做出更精确的定义:
Given a list L of numbers, create a list M that contains the valid indices of L, such that
M[i]
is the index at which thei
th element of L occurs, when sorted. PresentM
as if the first element of L occurs at index 1.
现在,列表的有效索引有两种方式:
range(len(L))
: 给出一个数字序列 0...len(L)-1enumerate(L)
:给出一个元组序列(0, L[0])... (len(L)-1, L[len(L)-1])
由于您想在列表索引从 1 开始的假设下操作(实际上它们在 python 中从 0 开始),我们需要做一些偏移设置
range(len(L))
变成 `range(1, len(L)+1)enumerate(L)
变为enumerate(L, 1)
(可选参数告诉enumerate
从 1 开始编号)
因为我们也需要列表项,所以我们使用 enumerate
,而不是使用 range
并进行查找(我个人更喜欢这种方法,虽然两者都有效)
所以现在,我们可以得到一个元组列表,其中每个元组包含L中的一个元素的索引和L中对应的元素。我们需要根据元素本身对其进行排序。这可以通过调用 sorted
来完成,可选的 key
参数说明我们应该按元组的第二个元素排序(operator.itemgetter(1)
就是这样说的)。
一旦我们有了这样的元组的排序列表,我们需要做的就是提取每个元组的第一个元素(L 中的索引),我们可以使用列表推导 [i[0] for i in mylist]
,或者等价地[operator.itemgetter(0)(t) for t in mylist]
将所有这些元素放在一起,我们得到以下内容
In [138]: L = [55, 41, 45, 43, 60, 47, 33, 70, 42, 42, 44]
In [139]: [operator.itemgetter(0)(t) for t in sorted(enumerate(L,1), key=operator.itemgetter(1))]
Out[139]: [7, 2, 9, 10, 4, 11, 3, 6, 1, 5, 8]