Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python defaultdict: 0 vs. int and [] vs list

Is there any difference between passing int and lambda: 0 as arguments? Or between list and lambda: []?

It looks like they do the same thing:

from collections import defaultdict dint1 = defaultdict(lambda: 0) dint2 = defaultdict(int) dlist1 = defaultdict(lambda: []) dlist2 = defaultdict(list)  for ch in 'abracadabra':     dint1[ch] += 1     dint2[ch] += 1     dlist1[ch].append(1)     dlist2[ch].append(1)  print dint1.items() print dint2.items() print dlist1.items() print dlist2.items() ## -- Output: -- [('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)] [('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)] [('a', [1, 1, 1, 1, 1]), ('r', [1, 1]), ('b', [1, 1]), ('c', [1]), ('d', [1])] [('a', [1, 1, 1, 1, 1]), ('r', [1, 1]), ('b', [1, 1]), ('c', [1]), ('d', [1])] 

but are there any cases where they'll have different behavior, or is it merely a notational difference?

like image 568
beardc Avatar asked May 28 '12 17:05

beardc


People also ask

What does Defaultdict list do in Python?

The Python defaultdict type behaves almost exactly like a regular Python dictionary, but if you try to access or modify a missing key, then defaultdict will automatically create the key and generate a default value for it. This makes defaultdict a valuable option for handling missing keys in dictionaries.

What does Defaultdict Int mean?

defaultdict means that if a key is not found in the dictionary, then instead of a KeyError being thrown, a new entry is created. The type of this new entry is given by the argument of defaultdict.

Is Defaultdict faster than dict?

get method and the experiment shows that defaultdict more that two times faster than dict.

What does the Defaultdict () function do?

A defaultdict works exactly like a normal dict, but it is initialized with a function (“default factory”) that takes no arguments and provides the default value for a nonexistent key. A defaultdict will never raise a KeyError. Any key that does not exist gets the value returned by the default factory.


1 Answers

All that defaultdict requires is a callable object that will return what should be used as a default value when called with no parameters.

If you were to call the int constructor, it would return 0 and if you were to call lambda: 0, it would return 0. Same with the lists. The only difference here is that the constructor will always use it's logic to create the object. A lambda, you could add additional logic if you chose to do so.

e.g.,

# alternating between `0` and `[]` from itertools import count factory = lambda c=count(): 0 if next(c) % 2 else [] superdict = defaultdict(factory) 
like image 60
Jeff Mercado Avatar answered Sep 22 '22 17:09

Jeff Mercado