"Alan Gauld" <alan.ga...@btinternet.com> wrote

I ended up with this :

Version 3 :
for i,row in d[:].iteritems() : # BUG : TypeError: unhashable type
   if len(row) < 2 :
       del d[i]

You are getting too complicated.
You don't need the slice and you don't need iteritems.
You have a dictionary. When you iterate over a dictionary
what do you get? Don't know? Try it::

for x in {1:'foo',2:'bar'}: print x
...
1
2

So we get the keys. Now how do we use the keys to get the list?
Standard dictionary access:

print d[1]
foo

You know how to test the lenth of the list and delete the list so put
that together as you did before:

for row in d :     # row is actually the key
  if len(row) == 1 :        # so use the key to get the real row
    del row # WRONG      #' and delete the row, again using the key


Oops, as Peter pointed out that won't work because its changing
the iterable while we iterate. (I actually thought it would be OK
because the for would use a copy of the keys() list, but I was wrong...)
But you can fix that with a list() call:

for row in list(d) :     # generates a new list of the dict keys
  if len(d[row]) == 1 :        # so use the key to get the real row
    del d[row]


HTH,


--
Alan Gauld
Author of the Learn to Program web site
http://www.alan-g.me.uk/




HTH,


--
Alan Gauld
Author of the Learn to Program web site
http://www.alan-g.me.uk/


_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor



_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to