Python 3.5.2 - list.sort()无法正常运行

时间:2016-11-20 04:19:35

标签: list python-3.x sorting numpy matrix

我试图通过重新创建2048来教自己一些基本的编码,但我已经碰壁了。

我要做的是:

1)创建一个表示板上空间的矩阵,空值为零值

2)根据玩家想要移动棋子的轴移动矩阵的轴

3)使用np.tolist()

从矩阵中的每一行创建一个列表

4)使用listID.sort(key = bool)按照其真值对列表进行排序,将零置于列表的一端而不重新排列具有值的项目,并通过修改以下列表来节省空间:地方

5)合并列表中值相等的相邻项

6)使用np.columnstack将排序后的列表组合成一个矩阵,过去编写前一个矩阵

7)将轴移位到原来的位置

我被绊倒的地方是步骤4)。

列表根本没有排序,没有任何变化。

例如a0(第一行的列表)将是[0,2,0,0],但在排序之后,它仍然是[0,2,0,0]。

这是我可怕的,nooby,WIP代码,如果您愿意,可以查看和寻找自己:

import numpy as np

a = np.matrix([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]])

print (a)

b = np.random.randint(low=0, high=3)

c = b
while c == b:
      c = np.random.randint(low=0, high=3)

d = np.random.randint(low=0, high=3)

e = d
while e == d:
      e = np.random.randint(low=0, high=3)

a.itemset((b, c), 2)
a.itemset((d, e), 2)

print (a)

score = np.sum(a)

print (score)

#while 0 in a:
      #direction = input("U, D, L, R?")

      #if direction == "U":
        # mode = 1

      #if direction == "D":
         # mode = 2

      #if direction == "L":
         # mode = 3

      #if direction == "R":
         # mode = 4

#transpose axes according to mode



#sort each array in matrix by boolean value
#refuses to sort?

a0 = a[0].tolist()
a0.sort(key=bool)

a1 = a[1].tolist()
a1.sort(key=bool)

a2 = a[2].tolist()
a2.sort(key=bool)

a3 = a[3].tolist()
a3.sort(key=bool)

#reverse each list depending on mode


#combine back into matrix

print (a0, a1, a2, a3)

a = np.column_stack([[a0], [a1], [a2], [a3]])


print (a)

我进行了搜索和搜索,但我所看到的并没有提供一些有关我如何做错的见解,我认为我是。

编辑:已解决!

import numpy as np
import numpy.matlib
import itertools

a = np.matlib.zeros((4,4))

print (a)

b = np.random.randint(low=0, high=3)

c = b
while c == b:
      c = np.random.randint(low=0, high=3)

d = np.random.randint(low=0, high=3)

e = d
while e == d:
      e = np.random.randint(low=0, high=3)

a.itemset((b, c), float(2))
a.itemset((d, e), float(2))

print (a)

score = np.sum(a)

print (score)

#while 1 in a:
      #direction = input("U, D, L, R?")

      #if direction == "U":
        # mode = 1

      #if direction == "D":
         # mode = 2

      #if direction == "L":
         # mode = 3

      #if direction == "R":
         # mode = 4

#transpose axes according to mode



#sort each array in matrix by boolean value
#refuses to sort?

a0 = a[0].tolist()
a01 = []
a0_2 = list(itertools.chain.from_iterable(a0))
for item in a0_2:
      a01.append(float(item))
a01.sort(key=bool)

a1 = a[1].tolist()
a11 = []
a1_2 = list(itertools.chain.from_iterable(a1))
for item in a1_2:
      a11.append(float(item))
a11.sort(key=bool)

a2 = a[2].tolist()
a21 = []
a2_2 = list(itertools.chain.from_iterable(a2))
for item in a2_2:
      a21.append(float(item))
a21.sort(key=bool)

a3 = a[3].tolist()
a31 = []
a3_2 = list(itertools.chain.from_iterable(a3))
for item in a3_2:
      a31.append(float(item))
a31.sort(key=bool)


#reverse each list depending on mode


#combine back into matrix

print (a01, a11, a21, a31)

a = np.vstack([[a01], [a11], [a21], [a31]])


print (a)

1 个答案:

答案 0 :(得分:1)

你说你正在试图“按真值排序”,而且NumPy没有这个选项。嗯,确实如此!

 a0 = a0[(~a0.astype(bool)).argsort(kind='mergesort')]

这需要a0并将其转换为True,无论它是非零,然后将其反转(对非零而言为False),然后对其进行排序(使用mergesort进行稳定排序)。 argsort()的使用让我们可以进行“间接”排序,即将一件事分类。

相比之下,通过将数组转换为列表然后再返回来完成它的方式相当低效。但是如果数据很小,你就不会注意到这一点,就像你的情况一样。