1

わかりました、私はPythonを初めて使用し、リストのスライスについて何かが私を悩ませています。このコードから [1] と [3] をスライスすると、[1, 3, 4] が返されるのはなぜですか?

z = [1, 2, 3, 4, 5]
del z[1], z[3]
print z

[2]と[4]が削除されているように見えるので、[1、3、5]が返されると思いました。

if-->[1, 2, 3, 4, 5]
is-->[0, 1, 2, 3, 4]

私のロジックがめちゃくちゃになっているのはどこですか?

4

5 に答える 5

6

最初の削除はリストのインデックスを変更するため、次の削除は以前の場所ではありません...

>>> a = [1, 2, 3]
>>> del a[0] # should delete 1
>>> a
[2, 3]
>>> del a[1] # This use to be the index for 2, but now `3` is at this index
>>> a
[2]
于 2012-12-13T18:16:29.623 に答える
3

削除は一度に 1 つずつ行われます。最初の削除では、後続のすべての要素が 1 つ左に移動します。

In [3]: z = [1, 2, 3, 4, 5]

In [5]: del z[1]

In [6]: z
Out[6]: [1, 3, 4, 5]

In [7]: z[3]
Out[7]: 5

インデックスを最大から最小に並べると、関連するインデックスは削除されないため、これは発生しません。

In [18]: z = [1, 2, 3, 4, 5]

In [19]: del z[3], z[1]

In [20]: z
Out[20]: [1, 3, 5]
于 2012-12-13T18:17:00.970 に答える
1

削除を行っているとき、それらは一度に 1 つずつ発生するため、削除するたびに右方向の値が 1 つのインデックスを左に移動します。

z = [1, 2, 3, 4, 5]

del z[1] # [1, X, 3, 4, 5] --> [1, 3, 4, 5]

del z[3] # [1, 3, 4, X] --> [1, 3, 4]

順序を維持するためにすべきことは、削除を最大から最小のインデックスに並べ替えて、何もシフトオーバーしないようにすることです。つまり、

del z[3]; del z[1]

問題を完全に回避するために、すべての削除を一度に行うことをお勧めします。

z = [1, 2, 3, 4, 5]
del z[1::2]
# returns [1, 3, 5]
于 2012-12-13T18:22:43.270 に答える
0

他の人があなたのコードの何が問題なのかについて言及しており、あなたがやろうとしていることの理由を本当に理解できます

2 番目と 4 番目の要素を削除し、移動するリストをあまり気にしない場合は、単一のブレッドで行う必要があります。可能な解決策は、List COmprehension を使用することです

def inplace_del(it, rng): 
    return [e for i, e in enumerate(it) if i not in set(rng)]
inplace_del(z,(2,3))
[1, 2, 5]
y = xrange(1,6)
inplace_del(y,(2,3))
[1, 2, 5]

より良い解決策は itertools を使用することです

>>> from itertools import count, compress
>>> def in_del(it, rng):
    rng = set(rng)
    holes = (e not in rng for e in count(0))
    return compress(it, holes)

>>> list(in_del(z,(2,3)))
[1, 2, 5]
>>> list(in_del(y,(2,3)))
[1, 2, 5]
>>> 
于 2012-12-13T18:21:36.277 に答える
0

この動作が見られる理由は、とが別々の行にあるのdel z[1], z[3]とまったく同じだからです。したがって、最初のステートメントは後続の要素をシフトし、最後の要素 ( ) になります。del z[1]del z[3]delz[3]5

>>> def del_test():
...     del z[1], z[3]
...
>>> def del_test2():
...     del z[1]
...     del z[3]
...
>>> del_test.__code__.co_code == del_test2.__code__.co_code
True
于 2012-12-13T18:22:30.537 に答える