2015-04-08 4 views
0

у меня есть список словарей, имеющий эта форма:питона: получить наиболее часто встречающееся значение в списке словарей

xs = [ { 'date': 1 }, { 'date': 1 }, { 'date': 2 }, { 'date': 1 }, { 'date': 4 }] 

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

Мой подход был бы:

  1. сортировать список по дате
  2. группа по дате
  3. получить максимальную() длина сравнивающие группы

пример:

sorted_xs = sorted(xs, key=lambda x: x['date']) 
ys = groupby(sorted_xs, lambda x: x['date']) 
??? 

это не работает (и некрасиво):

max(list(groupby(sorted_xs, lambda x: x['date'])), key=lambda (k, x):len(list(x))) 

Вы знаете, любой метод, который более простой и выразительный в python?

+1

Есть ли другие ключи в этих словарях, или выход '{ 'дата': 1}' достаточно? –

+0

есть другие ключи, но они неактуальны – JackNova

ответ

3

Используйте collections.Counter() object сосчитать каждую дату:

from collections import Counter 

date_counts = Counter(d['date'] for d in xs) 
most_common = {'date': date_counts.most_common(1)[0][0]} 

Я предположил, что вы хотели, чтобы получить выход в виде словаря снова здесь, но вы могли бы просто использовать date_counts.most_common(1)[0][0] напрямую, если все, что вам было интересно in - это значение даты.

Демо:

>>> from collections import Counter 
>>> xs = [{'date': 1}, {'date': 1}, {'date': 2}, {'date': 1}, {'date': 4}] 
>>> date_counts = Counter(d['date'] for d in xs) 
>>> {'date': date_counts.most_common(1)[0][0]} 
{'date': 1} 
+1

Зачем вы включили '[1]'? '[0]' кажется более подходящим. – Joost

+3

@Joost: Мне нужен кофеин. Пойдем, чтобы получить некоторые сейчас. –

Смежные вопросы