我有一个数字列表:
myList = [1, 2, 3, 100, 5]
Run Code Online (Sandbox Code Playgroud)
现在,如果我对此列表进行排序以获取[1, 2, 3, 5, 100].我想要的是排序顺序中原始列表中元素的索引,即[0, 1, 2, 4, 3]
--- ala MATLAB的sort函数,它返回值和索引.
我需要对列表进行排序,然后返回一个列表,其中包含列表中已排序项的索引.例如,如果我要排序的列表是[2,3,1,4,5],我需要[2,0,1,3,4]返回.
这个问题是在字节上发布的,但我想我会在这里重新发布. http://bytes.com/topic/python/answers/44513-sorting-list-then-return-index-sorted-item
我特别需要根据对象的属性对对象列表进行排序.然后,我需要重新排序相应的列表以匹配新排序列表的顺序.
有没有办法做到这一点?
我正在寻找一种有效的方法来计算Python中列表的秩向量,类似于R的rank函数.在元素之间没有联系的简单列表中,列表的等级向量的元素il应该是x,当且仅当l[i]是排序列表中的第x个元素时.到目前为止,这很简单,以下代码片段可以解决这个问题:
def rank_simple(vector):
return sorted(range(len(vector)), key=vector.__getitem__)
Run Code Online (Sandbox Code Playgroud)
然而,如果原始列表具有联系(即具有相同值的多个元素),则事情变得复杂.在这种情况下,具有相同值的所有元素应该具有相同的等级,这是使用上述朴素方法获得的等级的平均值.所以,例如,如果我有[1, 2, 3, 3, 3, 4, 5],天真的排名给了我[0, 1, 2, 3, 4, 5, 6],但我想拥有的是[0, 1, 3, 3, 3, 5, 6].在Python中哪一个是最有效的方法?
脚注:我不知道NumPy是否已经有了实现这一目标的方法; 如果确实如此,请告诉我,但无论如何我都会对纯Python解决方案感兴趣,因为我正在开发一个在没有NumPy的情况下也可以工作的工具.
我经常使用lambda表达式在Python中进行排序,虽然它工作正常,但我觉得它不是很易读,并希望有更好的方法.这是我的典型用例.
我有一个数字列表,例如, x = [12, 101, 4, 56, ...]
我有一个单独的索引列表: y = range(len(x))
我想y根据值中的值排序x,我这样做:
y.sort(key=lambda a: x[a])
Run Code Online (Sandbox Code Playgroud)
有没有使用lambda这样做的好方法?
我想要一个函数返回一个列表,这样,给定一个"混乱"列表l,每个元素是相应元素的索引l,如果l被排序.(我没有想到一种不太复杂的说法,对不起.)
例子
f([3,1,2]) = [2,0,1]
f([3,1,2,2,3])= [3,0,1,2,4],因为输入已排序[1,2,2,3,3].
(这对某些统计数据计算很有用.)
我想出了一种方法来做这个功能,但这是python - 似乎应该有一个单行来做这个,或者至少是一个更清洁,更清晰的方式.
def getIndiciesInSorted(l):
sortedL = sorted(l)
outputList = []
for num in l:
sortedIndex = sortedL.index(num)
outputList.append(sortedIndex)
sortedL[sortedIndex] = None
return outputList
l=[3,1,2,2,3]
print getIndiciesInSorted(l)
Run Code Online (Sandbox Code Playgroud)
那么,我怎样才能更简洁地写出来呢?有清晰易读的清单解决方案吗?
我有一个清单 [[4,5,6],[2,3,1]].现在我想根据list[1]输出 排序列表[[6,4,5],[1,2,3]].所以基本上我正在排序2,3,1和维护顺序list[0].
在搜索时,我得到了一个基于每个列表的第一个元素进行排序的函数,但不是为此.此外,我不想重新创建列表[[4,2],[5,3],[6,1]],然后使用该功能.