sg = tuple(s.get('дом') for s in [S1, S2, S3, S4, S5]) x = {s: sg.count(s) for s in set(sg)} print(x)
out:
{'55': 1, '44': 1, '33': 1, '77': 2}
speed
import timeit, random from collections import Counter from itertools import groupby def T_tuple(): sg = tuple(s.get('дом') for s in S) return {s: sg.count(s) for s in set(sg)} def C_Counter(): return Counter([d['дом'] for d in S]) def G_groupby(): r = groupby(sorted(S, key=lambda x: x['дом']), lambda x: x['дом']) return [(k, len(list(g))) for k, g in r] if __name__ == '__main__': fns = C_Counter, G_groupby, T_tuple for s, h in [(10000, 10), (10000, 100), (10000, 1000), (10, 10), (10, 100), (10, 1000)]: S = [{'имя': r, 'дом': random.randrange(h)} for r in range(s)] print('\nlen(S):', s, 'len(дом):', h) t = [(fn.__name__, timeit.Timer(fn).timeit(10)) for fn in fns] for e, (n, tmt) in enumerate(sorted(t, key=lambda r: r[1]), start=1): print("{}' {:.4} {}".format(e, tmt, n))
out:
len(S): 10000 len(дом): 10 1' 0.01853 C_Counter 2' 0.05015 T_tuple 3' 0.06918 G_groupby len(S): 10000 len(дом): 100 1' 0.01672 C_Counter 2' 0.08368 G_groupby 3' 0.2862 T_tuple len(S): 10000 len(дом): 1000 1' 0.02135 C_Counter 2' 0.09862 G_groupby 3' 2.634 T_tuple len(S): 10 len(дом): 10 1' 7.795e-05 T_tuple 2' 0.0001365 G_groupby 3' 0.000157 C_Counter len(S): 10 len(дом): 100 1' 0.0001153 C_Counter 2' 0.0001153 T_tuple 3' 0.000209 G_groupby len(S): 10 len(дом): 1000 1' 0.0001025 T_tuple 2' 0.0001058 C_Counter 3' 0.0001683 G_groupby