Python 根据给定列对条目列表进行排序并返回索引列表

Python 根据给定列对条目列表进行排序并返回索引列表,python,Python,给定一个条目列表(例如数据块,即元组),如何根据一列(特征,例如int)对列表进行排序,并返回其原始索引列表(如函数np.argsort()),而不是整个已排序的条目列表 我尝试使用lambda表达式,但不知道如何将索引功能整合到一起: list1sorted=sorted(list1, key=lambda x: x[1]) 这里ldf包含两个列表,它按列表1排序,您可以从数据帧的索引(result.index)中找到索引。不是简短的答案,但如果必须的话 alist = [(1,"b"),

给定一个条目列表(例如数据块,即元组),如何根据一列(特征,例如int)对列表进行排序,并返回其原始索引列表(如函数
np.argsort()
),而不是整个已排序的条目列表

我尝试使用lambda表达式,但不知道如何将索引功能整合到一起:

list1sorted=sorted(list1, key=lambda x: x[1]) 

这里ldf包含两个列表,它按列表1排序,您可以从数据帧的索引(
result.index
)中找到索引。

不是简短的答案,但如果必须的话

alist = [(1,"b"),(5,"a"),(3,"c")]
index = {}
for i,item in enumerate(alist):
    index[item] = i

original_indexes = [index[x] for x in sorted(alist,key=lambda x: x[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]

在黑暗时代,通常使用DSU(装饰-排序-取消装饰)根据任意属性对对象列表进行排序

现在我们有了
参数,我们可以恢复这个模式,只保留装饰

def argsort(l, field_no):
    return (t[0] for t in sorted(enumerate(l), key=lambda x:x[1] [field_no]))
这里的修饰是由通常的
枚举
产生的,它给我们每个项的索引,因此我们必须对一个2元组的列表进行排序,第一个元素是索引,第二个元素是原始列表的元素,我们使用
参数根据原始列表的字段进行排序,我们去掉了原来的列表元素

下面是上述方法的简要演示

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]: 
[1]中的
:来自随机导入洗牌
在[2]中:l=[(chr(60+i),i)表示范围(10)内的i]
在[3]中:洗牌(l);L
出[3]:
[('@', 4),
('?', 3),
('A',5),
('', 2),
('C',7),
('E',9),
('B',6),
('=', 1),
('D',8)]
在[4]中:def argsort(l,字段号):
…:返回(t[0]表示排序中的t(枚举(l),key=lambda x:x[1][field_no]))
...: 
在[5]中:对于argsort(l,1)中的i:print(l[i])
('', 2)
('?', 3)
('@', 4)
('A',5)
('B',6)
('C',7)
('D',8)
('E',9)
在[6]中:
注意这里
argsort
返回一个生成器,将
返回(..)
更改为
返回[…]
如果需要列表。

什么是“原始索引列表”?您可以无需排序就获得“原始”索引。条目的数据类型是什么?
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]: