Я видел, как другие программисты Python использовали defaultdict из модуля коллекций для следующего использования:
from collections import defaultdict
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
def main():
d = defaultdict(list)
for k, v in s:
d[k].append(v)
Я обычно подходил к этой проблеме, используя вместо этого setdefault:
def main():
d = {}
for k, v in s:
d.setdefault(k, []).append(v)
Фактически документы утверждают, что использование defaultdict выполняется быстрее, но я видел, что обратное было верно при тестировании себя:
$ python -mtimeit -s "from withsetdefault import main; s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)];" "main()"
100000 loops, best of 3: 4.51 usec per loop
$ python -mtimeit -s "from withdefaultdict import main; s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)];" "main()"
100000 loops, best of 3: 5.38 usec per loop
Что-то не так с тем, как я настроил тесты?
Для справки, я использую Python 2.7.3 [GCC 4.2.1 (Apple Inc. build 5666)