наилучший способ для перегруппировки результатов и подсчета их из набора запросов? - PullRequest
0 голосов
/ 11 июня 2019

это мои результаты из моего набора запросов после группировки, я хочу перегруппировать то же значение раз, а затем подсчитать итоги,

<QuerySet [{'times': 5, 'total': 1}, {'times': 60, 'total': 1}, {'times': 60, 'total': 1}, {'times': 55, 'total': 1}, {'times': 55, 'total': 1}, {'times': 50, 'total': 1}, {'times': 50, 'total': 1}, {'times': 45, 'total': 1}, {'times': 40, 'total': 2}, {'times': 30, 'total': 1}, {'times': 25, 'total': 1}, {'times': 25, 'total': 1}, {'times': 25, 'total': 1}, {'times': 20, 'total': 1}, {'times': 15, 'total': 1}, {'times': 15, 'total': 1}, {'times': 15, 'total': 2}, {'times': 15, 'total': 1}]>

Я пытался использовать для в , но на самом деле не работал должным образом, с помощью счетчика

тип unhashable: «ломтик», тип индексов и т. д.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Другой способ использования collections.defaultdict:

from collections import defaultdict
d_dict = defaultdict(int)

for d in mylist:
    d_dict[d['times']] += d['total']

[{'times':i[0],'total':i[1]} for i in d_dict.items()]

Результат:

[{'times': 5, 'total': 1},
 {'times': 15, 'total': 5},
 {'times': 20, 'total': 1},
 {'times': 25, 'total': 3},
 {'times': 30, 'total': 1},
 {'times': 40, 'total': 2},
 {'times': 45, 'total': 1},
 {'times': 50, 'total': 2},
 {'times': 55, 'total': 2},
 {'times': 60, 'total': 2}]
1 голос
/ 11 июня 2019

Использование itertools.groupby и operator.itemgetter:

import itertools
import operator

f = lambda x:x['times']
[{'times':k, 'total': sum(map(operator.itemgetter('total'), g))}
  for k, g in itertools.groupby(sorted(l, key=f), key=f)]

Выход:

[{'times': 5, 'total': 1},
 {'times': 15, 'total': 5},
 {'times': 20, 'total': 1},
 {'times': 25, 'total': 3},
 {'times': 30, 'total': 1},
 {'times': 40, 'total': 2},
 {'times': 45, 'total': 1},
 {'times': 50, 'total': 2},
 {'times': 55, 'total': 2},
 {'times': 60, 'total': 2}]

Объяснение {'times':k, 'total': sum(map(operator.itemgetter('total'), g))}:

  • itertools.groupby возвращает итерацию (group_keys, groups).
  • map ing operator.itemgetter('total') до g совпадает с [d['total'] for d in g], то есть получает все total s от всех dict s, принадлежащих к одной группе.
  • И, наконец, создайте новые dict для каждой группы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...