Albert-Jan Roskam wrote:
b.get(k, []) will not return the default value [], but 'None' if k is not 
present in 'b'. Why?

Incorrect. b.get(k, []) returns the default value [] as expected.

You then call the append method on that list, which returns None, and then you assign that result (None) to the dict item.


b = {}
process = lambda k: k**2

"process"? Surely "squared" would be a more descriptive and less misleading 
name.


for i in range(100):
  k = random.randint(1, 10)
  v = process(k)
  b[k] = b.get(k, []).append(v) # <--- error!

If b.get(k, []) did not return a list, the call to append would fail with AttributeError.


Here are two ways to solve this correctly:


for i in range(100):
    k = random.randint(1, 10)
    v = process(k)
    b.setdefault(k, []).append(v)


for i in range(100):
    k = random.randint(1, 10)
    v = process(k)
    b[k] = b.get(k, []) + [v]


The first way is more efficient and will probably be faster as the lists get longer. For small lists it is unlikely to make much difference.



--
Steven

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

Reply via email to