2017-03-13 8 views
1

少なくとも時間、すなわちO(k(m + n))時間でk-タプルソートを実装したいと思います。k-タプルソートでのpythonリストインデックスの範囲外

私のコードは次のとおりです。インデックスが範囲外であると、私はB[a[j]].append(a)でエラーを取得しています

A = [(1,2,1),(2,3,1),(1,4,2),(2,2,2),(1,4,3),(3,2,1)] 
B = [[] for _ in range(5)] 

n = len(A[0]) - 1 

for j in (n,0,-1): 
    while(len(A) != 0): 
     a = A.pop(0) 
     B[a[j]].append(a) 
    for l in range(5): 
     A.append(B[l]) 

print(A) 

答えて

-1

あなたはBで何かを追加することを忘れているようだ[0]、あなたはここで1と2を配置するためにリストを追加始めるあなたは

>>> A = [(1,2,1),(2,3,1),(1,4,2),(2,2,2),(1,4,3),(3,2,1)] 
>>> B = [[] for _ in range(5)] 
>>> 
>>> n = len(A[0]) - 1 
>>> 
>>> for j in (n,0,-1): 
...  print("j:%d" % j) 
...  while(len(A) != 0): 
...   a = A.pop(0) 
...   print("appending %s at position %s" % (str(a), str(a[j]))) 
...   B[a[j]].append(a) 
...  print("B:" + str(B)) 
...  for l in range(5): 
...   print("l:%d" %l) 
...   A.append(B[l]) 
...  print("A:" + str(A)) 
... 
j:2 
appending (1, 2, 1) at position 1 
appending (2, 3, 1) at position 1 
appending (1, 4, 2) at position 2 
appending (2, 2, 2) at position 2 
appending (1, 4, 3) at position 3 
appending (3, 2, 1) at position 1 
B:[[], [(1, 2, 1), (2, 3, 1), (3, 2, 1)], [(1, 4, 2), (2, 2, 2)], [(1, 4, 3)], []] 
l:0 
l:1 
l:2 
l:3 
l:4 
A:[[], [(1, 2, 1), (2, 3, 1), (3, 2, 1)], [(1, 4, 2), (2, 2, 2)], [(1, 4, 3)], []] 
j:0 
Traceback (most recent call last): 
    File "<stdin>", line 5, in <module> 
IndexError: list index out of range 
+0

変数の表示はプログラムの機能を理解するのに便利ですが、これは質問に対する答えではありません。 –

+0

どのように私は上記の、彼はリストBの最初の要素を設定しないので、prorgamは失敗します。このことから、あなたが正しく示唆するように、彼は正しい方法でそれを入力して修正を実行することができます。とにかく、彼は尋ねる者と細部の貧弱さに関する答えは明らかではありませんでした。 – bull90

0

をやっていることである私は、あなたが基数ソートを実装しようとしていることを理解。あなたがリストAの最後にB[l]要素を追加するのではなく、リストAの最後の要素としてリストB[l]を追加するため

ラインA.append(B[l])は間違っています。これは、a[j]IndexErrora = []としてトリガする原因となり、forループの2番目の繰り返しです。

次に、外側のforループは(documentation hereを参照)の場合[2, 1, 0]を返すrange(n, -1, -1)を使用します。

また、Bは、外側ループの反復ごとに空である必要があります。

A = [(1,2,1),(2,3,1),(1,4,2),(2,2,2),(1,4,3),(3,2,1)] 

n = len(A[0]) - 1 

for i in range(n, -1, -1): # range(start, stop, step) 
    B = [[] for _ in range(5)] # B needs to be empty for each iteration 
    while(len(A)): 
     a = A.pop(0) 
     B[a[i]].append(a) 

    for j in range(5): 
     A += B[j] # Adding elements of B[j] to the end of A 

print(A) 
+0

@サム私はあなたがおそらく基調講演の後であることを認識したので、答えを編集しました。 –

関連する問題