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