给定一个条目列表(例如,数据片段,它们是元组),如何根据一列(特征,例如int)对列表进行排序,并且不返回整个排序的条目列表,而是返回其列表原始索引(如函数np.argsort()
)?
我尝试使用lambda表达式但不知道如何使用索引功能:
list1sorted=sorted(list1, key=lambda x: x[1])
答案 0 :(得分:1)
import pandas as pd
lst = [13,6,3,2,1,7,6,8]
othr = [5,2,7,9,2,5,7,10]
df = pd.DataFrame({"list1": lst, "list2": othr})
result = df.sort_values("list1")
这里ldf包含两个列表,它按list1排序,您可以从数据帧的索引(result.index
)中找到索引。
答案 1 :(得分:0)
不是简短的回答,但如果你必须
<span>{{item.status | statusupdator}}</span>
答案 2 :(得分:0)
我的变化:
def sort_index(z):
"""
>>> sort_index([(1,"b"),(5,"a"),(3,"c")])
[0, 2, 1]
"""
number = [a[0] for a in z]
return [x[1] for y in number for x in zip(sorted(number), range(len(z))) if x[0] == y]
答案 3 :(得分:0)
在黑暗时代,DSU(Decorate Sort Undecorate)通常会根据任意属性对对象列表进行排序。
我们可以恢复这种模式,现在我们有key
参数,只保留装饰......
def argsort(l, field_no):
return (t[0] for t in sorted(enumerate(l), key=lambda x:x[1] [field_no]))
这里的装饰是由通常的enumerate
生成的,它给出了每个项目的索引,因此我们必须对2元组的列表进行排序,第一个元素是索引,第二个元素是在原始列表中,我们使用key
参数根据原始列表的字段进行排序,然后我们将原始列表元素删除...
以下是该方法的简要演示
In [1]: from random import shuffle
In [2]: l = [(chr(60+i), i) for i in range(10)]
In [3]: shuffle(l); l
Out[3]:
[('@', 4),
('?', 3),
('A', 5),
('<', 0),
('>', 2),
('C', 7),
('E', 9),
('B', 6),
('=', 1),
('D', 8)]
In [4]: def argsort(l, field_no):
...: return (t[0] for t in sorted(enumerate(l), key=lambda x:x[1][field_no]))
...:
In [5]: for i in argsort(l, 1): print(l[i])
('<', 0)
('=', 1)
('>', 2)
('?', 3)
('@', 4)
('A', 5)
('B', 6)
('C', 7)
('D', 8)
('E', 9)
In [6]:
请注意,此处argsort
会返回一个生成器,将return (..)
更改为
return [...]
如果您需要列表。