2017-08-08 24 views
-3

私が注文したリストに値を追加しようとしているが、リストは変更されません。リストが変更されないのはなぜですか?

def insert(V, x): 

    if len(V)!=0: 

     for i in range(0 , len(V)-1): 
      if (V[i]<=x)and(V[i+1]>=x): 
       V=V[0:i+1]+[x]+V[i+1:len(V)] 
       print("\nExpected: \n"+ repr(V)) 
       return 

    V=V+[x] 
    return 

私はこの持っている:

V=[1,2,3,4,5,6,7,8,9,10] 
insert(V, 6) 
print("\nResult: \n"+ repr(V))enter code here 

をし、これが結果です:

Expected: 
[1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10] 

Result: 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

リターンとしてVを設定する問題を解決することができますが、関数をリスト上で動作させたいと思います。

+2

[python;関数内のリストを変更する](https://stackoverflow.com/questions/22054698/python-modifying-list-inside-a-function) – AChampion

+0

'list.insert()'を使用できない理由はありますか? –

+0

'' 'v。 は[私が作る持っていることを確信している);私はそれを行うには、より簡単な方法を持っていることを知っているが、私は別のコースに勉強していると私は改訂パイソンのためにこの機会を利用(インデックス、値) '' ' –

答えて

1

list.insertで簡単にやっていることができます。あなたの機能が動作しない理由として

関数に渡されたリストは、現在の基準Vを介して更新されるように、あなたは、フルスライス割り当てを使用して、元のリストを更新する必要があります。

... 
V[:] = V[0:i+1] + [x] + V[i+1:len(V)] 
#^

RHS(右手側)は新しいリストオブジェクトであることに注意してください。 Vだけに代入すると、名前/変数が新しいリストオブジェクトに再バインドされます。ただし、スライスの割り当てを使用すると、元のリストが新しいリストの値で更新されます。

+0

を挿入文章に間違いがあります] – Lorenzo

+0

mmm rhsが何を意味するのか分かりません:P – Lorenzo

+0

@Lorenzo更新日: –

0

あなただけのリストにあなたの価値を付加し、その後

l.append(値)

l.sort()

0

あなたの機能が所定の位置にVを変更しませんが、それを並べ替えることができます。この行の後

V=V[0:i+1]+[x]+V[i+1:len(V)] 

Vはもはや関数に渡されたリストが、別のリストへの参照ではありません。この行は最初のリストを変更するのではなく、新しいリストを作成します。

あなたはreturn Vを入力し、Vのメソッドを呼び出します(例:list.insert())。

-1

他の人が指摘しているように、あなたは元のリストを変更していません。 (代わりに、新しいリストを作成しているし、それを返さない。)

ここでは、既存のリストを変更するlist.insertを活用してソリューションです:

def insert(lst, value): 
    '''Insert a value into a sorted list in-place, while maintaining sort order''' 

    for i, x in enumerate(lst): 
     if x > value: 
      lst.insert(i, value) 
      return 

    # fallback, in case this is the new largest 
    lst.append(value) 

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
insert(a, 6) 
print(a) # [1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10] 

EDIT

詳細は、コンパクトだがおそらく読みにくい:

def insert(lst, value): 
    lst.insert(next((i for i, x in enumerate(lst) if x > value), len(lst)), value) 
関連する問題