2016-11-20 7 views
1

私は2048を再作成して基本的なコーディングを教えようとしていますが、壁に当たっています。私は何をしようとしているPython 3.5.2 - list.sort()が機能しません

は次のとおりです。

1)空のスペース

2のためにゼロの値によって占められ、ボード上のスペースを表す行列を、作成)によるマトリックスの軸を転置プレイヤが

3のピースを移動させたい軸)(np.tolistを用いて行列の各列からリストを作成する)

4)ソートするlistID.sort(キー= BOOL)を使用しその真理値によってリストを作成し、そのゼロの部分をインプレース

5の値を持つアイテムを並べ替えると、リストを変更することで、スペースを保存せずにリスト)値

6に等しいリスト内の隣接するアイテムをマージ)結合するために使用np.columnstack前の行列

7)彼らはもともと私がつまずい)ステップ4であるそうだ

をしたものに軸を転置をovewriting、マトリックスにリストを並べ替えます。

リストはまったくソートされません。何も変わりません。

たとえばa0(最初の行のリスト)は[0,2,0,0]ですが、ソート後はSTILL [0,2,0,0]です。

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) 

私は検索と検索が、私が見たものはどのように私にいくつかの洞察を提供しなかったしました:あなたがそう望むなら、ここ

はWIPコードを見て、自分で見て、私のひどい、noobyです私はこれが間違っていると推測しています。

編集:SOLVED!

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

(問題のないものの後のすべてのもののように)重要でないもの、およびすべての冗長性(同じ破損コードの4つのコピー)を取り除きます。 –

+0

印刷コマンドは、私がコードに加えた変更が実際にリストをソートできるかどうかを確認するためのものです。 a(数)ラインの各々は、マトリックスの4つの行のうちの1つから作成された別個のリストである。 –

+0

私は、配列をコピーするための規約は、単に参照を作成するので、c = bではなくc [:] = bであると考えました。 –

答えて

1

あなたは「真理値による並べ替え」をしようとしており、そのNumPyにはオプションがないと言います。まあ、それは、一種! A0を取り、それがゼロだったどこTrueに変換し

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

は、その後、(ゼロでないためにそうFalse)が、その後、(安定ソートにマージを使用して)それをソートすることを反転します。 argsort()を使用すると、「間接的な」並べ替え、つまりあるものを別のものに並べ替えることができます。

リストをリストに変換してからもう一度変換する方法は、対照的に非常に非効率的です。しかし、あなたのケースでは、データが小さい場合には気付かないでしょう。

関連する問題