Prev: xml.dom.minidom character encoding
Next: Smtpd module
From: candide on 21 Apr 2010 15:56 Is the del instruction able to remove _at the same_ time more than one element from a list ? For instance, this seems to be correct : >>> z=[45,12,96,33,66,'ccccc',20,99] >>> del z[2], z[6],z[0] >>> z [12, 33, 66, 'ccccc', 20] >>> However, the following doesn't work : >> z=[45,12,96,33,66,'ccccc',20,99] >>> del z[2], z[3],z[6] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list assignment index out of range >>> Does it mean the instruction del z[2], z[3],z[6] to be equivalent to the successive calls del z[2] del z[3] del z[6] ?
From: Simon Brunning on 21 Apr 2010 16:12 On 21 April 2010 20:56, candide <candide(a)free.invalid> wrote: > Is the del instruction able to remove _at the same_ time more than one > element from a list ? Yup: >>> z=[45,12,96,33,66,'ccccc',20,99] >>> del z[:] >>> z [] -- Cheers, Simon B.
From: Gary Herron on 21 Apr 2010 16:40 candide wrote: > Is the del instruction able to remove _at the same_ time more than one > element from a list ? > > > For instance, this seems to be correct : > > > >>> z=[45,12,96,33,66,'ccccc',20,99] > >>> del z[2], z[6],z[0] > >>> z > [12, 33, 66, 'ccccc', 20] > >>> > > > However, the following doesn't work : > > >> z=[45,12,96,33,66,'ccccc',20,99] > >>> del z[2], z[3],z[6] > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > IndexError: list assignment index out of range > >>> > > > Does it mean the instruction > > del z[2], z[3],z[6] > > to be equivalent to the successive calls > > > del z[2] > del z[3] > del z[6] Yes, those are equivalent. The reason it fails is that, by the time it gets around to the third delete, there is no longer in index [6] in the list. The element you were thinking of is now at index [4]. This, however, will work as you expected: del z[6], z[3],z[2] -- Gary Herron, PhD. Department of Computer Science DigiPen Institute of Technology (425) 895-4418
From: Mensanator on 21 Apr 2010 16:49 On Apr 21, 2:56 pm, candide <cand...(a)free.invalid> wrote: > Is the del instruction able to remove _at the same_ time more than one > element from a list ? > > For instance, this seems to be correct : > > >>> z=[45,12,96,33,66,'ccccc',20,99] > >>> del z[2], z[6],z[0] > >>> z > [12, 33, 66, 'ccccc', 20] > >>> > > However, the following doesn't work : > > >> z=[45,12,96,33,66,'ccccc',20,99] > >>> del z[2], z[3],z[6] > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > IndexError: list assignment index out of range > >>> > > Does it mean the instruction > > del z[2], z[3],z[6] > > to be equivalent to the successive calls > > del z[2] > del z[3] > del z[6] That's part of the problem. Let's look at a better example. >>> z = [0,1,2,3,4,5,6] >>> del z[0],z[3],z[6] Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> del z[0],z[3],z[6] IndexError: list assignment index out of range >>> z [1, 2, 3, 5, 6] Yes, the error was caused by the list shrinking between calls, so the 6 did not get deleted. But notice that 3 is still there and 4 is missing. If you must delete this way, do it bottom up so that the index remains valid for the subsequent calls: >>> z = [0,1,2,3,4,5,6] >>> del z[6],z[3],z[0] >>> z [1, 2, 4, 5] > > ?
From: Emile van Sebille on 21 Apr 2010 16:57
On 4/21/2010 12:56 PM candide said... > Is the del instruction able to remove _at the same_ time more than one > element from a list ? > > > For instance, this seems to be correct : > > > >>> z=[45,12,96,33,66,'ccccc',20,99] Not as I see it -- watch your index values - they change after each delete is completed. It'll work if you order them backwards though. >>> a = range(10) >>> del a[0],a[2],a[4],a[6] >>> a [1, 2, 4, 5, 7, 8] >>> a = range(10) >>> del a[6],a[4],a[2],a[0] >>> a [1, 3, 5, 7, 8, 9] >>> Emile |