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

时间:2017-09-14 05:42:13

标签: python

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

我尝试使用lambda表达式但不知道如何使用索引功能:

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

4 个答案:

答案 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 [...]如果您需要列表。