2017-01-12 9 views
-2
v = [1, 3, 5, 6, 8, 10] 

f = [2, 4, 7, 9, 11, 12] 

def new(v,f): 

    i = 0 
    j = 0 
    u=[0]*12 
    for k in range(12): 
      if(v[i]<=f[j]): 
       u[k]+=v[i] 
       i+=1 
      elif(f[j]<=v[i]): 
       u[k]+=f[j] 
       j+=1 
    print(u) 
new(v, f) 

トレースバック(最新の呼び出しの最後):私が使用するたびにインデックスを範囲外にリストする?

ファイル "C:/Users/Matheus/PycharmProjects/untitled/dsfdsfs.py"

new(v, f) 
では、ライン15、

ファイル「C:範囲外のリストインデックス

:新しい

if(v[i]<=f[j]): 

はIndexErrorで/Users/Matheus/PycharmProjects/untitled/dsfdsfs.py」、8行目、

私はこのエラーの理由を説明できません

+1

Vの最後の要素の後:10で、毎回のV [i]が<= F [j]となり、あなたは私をインクリメントしようと、アウトされます範囲の。 – chapelo

答えて

0

リストvとfの長さが両方ともわずか6であるため、これは起こっています。 コードを実行すると、iが5を超えて増加し、エラーが発生します。あなたが結合しようとしているよう

for k in range(12): 
    try: 
     .... 
    except IndexError as err: 
     print(err) 
     print("i = ", i) 
     print("j = ", j) 
     print("k = ", k) 
+0

ありがとうございます!私はKの範囲で解決策を探していましたが、ついに理解しました。 –

0

に見えます:あなたがforループの中にtry/exceptブロックを追加して、I、Jの 値をプリントアウトし、失敗が表示されますkの場合

2つのリストは1つのソートされたリストになりますか?

これは、はるかに高速だったでしょう:

sorted(v+f) 
+0

そうです。しかし、このコードは実際にテストから来ており、このメソッドには質問が必要です。とにかくありがとう。 –

1
I = 5は、if文の最初の分岐が実行され

、と私は次のループでは6に増加されるが、それはVを比較しようとします[6]をf [j]に変換する。これにより、エラーがスローされます。

必要な反復回数がわからないので、whileループを使用する方がよいでしょう。 Pythonのリストは変更可能なので、.append()および.extend()関数を使用して別のカウンタを保持するのではなく、配列の末尾に値を追加するほうがはるかに簡単です。最後に、whileループの最後で、どのリストが使い果たされたかを確認し、ループを終了させ、最後に残りのリストを追加することができます。

例コード:

def new(v,f): 

    i = 0 
    j = 0 
    u = [] 
    # Compare values until one of the lists is exhausted 
    while i < len(v) and j < len(f): 
     if(v[i]<=f[j]): 
       u.append(v[i]) 
       i+=1 
     elif(f[j]<=v[i]): 
       u.append(f[j]) 
       j+=1 
    # Check which list was exhausted and add the rest of the other 
    # list on the end of the new list 
    if i >= len(v): 
     u.extend(f[j:]) 
    else: 
     u.extend(v[i:]) 
    print(u) 
関連する問題