```
def getRank(r):
# 定义一个临时数组记住一开始的顺序
indexes=range(0,len(r))
# 对每一列进行冒泡排序
for k in range(len(r[0])):
for i in range(len(r)):
for j in range(i):
if r[j][k] < r[i][k]:
# 交换所有的列以及用于记录一开始的顺序的数组
indexes[j], indexes[i] = indexes[i], indexes[j]
for l in range(len(r[0])):
r[j][l], r[i][l] = r[i][l], r[j][l]
# 将排序好的因子顺序变成排名
for i in range(len(r)):
r[i][k]=i+1
***# 再进行一次冒泡排序恢复一开始的股票顺序***
for i in range(len(r)):
for j in range(i):
if indexes[j] > indexes[i]:
indexes[j], indexes[i] = indexes[i], indexes[j]
for k in range(len(r[0])):
r[j][k], r[i][k] = r[i][k], r[j][k]
# 因为Python是引用传递,所以其实这个可以不用返回值也行,当然如果你想用另外一个变量来存储排序结果的话可以考虑返回值的方法
return r
```
这里冒泡排序的代码有问题
应该在对每个因子进行排序所得到的列表马上恢复一开始股票列表的顺序,然后才计算排第二个因子
即是
```
for k in range(len(r[0])):
for i in range(len(r)):
for j in range(i):
if r[j][k] < r[i][k]:
# 交换所有的列以及用于记录一开始的顺序的数组
indexes[j], indexes[i] = indexes[i], indexes[j]
for l in range(len(r[0])):
r[j][l], r[i][l] = r[i][l], r[j][l]
# 将排序好的因子顺序变成排名
for i in range(len(r)):
r[i][k]=i+1
# 再进行一次冒泡排序恢复一开始的股票顺序
for i in range(len(r)):
for j in range(i):
if indexes[j] > indexes[i]:
indexes[j], indexes[i] = indexes[i], indexes[j]
r[j][k], r[i][k] = r[i][k], r[j][k]
```
这样才能得到按股票列表的顺序每个因子排名的列表比如 股票列表的顺序为[A ,B,C]
两个因子的排名列表像这样
[ [1,2] , [3,1] , [2,3]]
A —— B—— C
楼主好,想请教一下,getRank()函数,想实现什么目的,这个排序没看明白。如果只是想要因子排序后的排名的话,那么用sort可以实现这个目的可以吗。另外,在这个冒泡排序中,为什么要‘再进行一次冒泡排序恢复一开始的股票顺序’?谢谢回答
```
def getRank(r):
# 定义一个临时数组记住一开始的顺序
indexes=range(0,len(r))
# 对每一列进行冒泡排序
for k in range(len(r[0])):
for i in range(len(r)):
for j in range(i):
if r[j][k] < r[i][k]:
# 交换所有的列以及用于记录一开始的顺序的数组
indexes[j], indexes[i] = indexes[i], indexes[j]
for l in range(len(r[0])):
r[j][l], r[i][l] = r[i][l], r[j][l]
# 将排序好的因子顺序变成排名
for i in range(len(r)):
r[i][k]=i+1
# 再进行一次冒泡排序恢复一开始的股票顺序
for i in range(len(r)):
for j in range(i):
if indexes[j] > indexes[i]:
indexes[j], indexes[i] = indexes[i], indexes[j]
for k in range(len(r[0])):
r[j][k], r[i][k] = r[i][k], r[j][k]
# 因为Python是引用传递,所以其实这个可以不用返回值也行,当然如果你想用另外一个变量来存储排序结果的话可以考虑返回值的方法
return r
```