2012-02-08 2 views
2

У меня есть список словарей. Каждый словарь имеет атрибут цвета. Например:Подсчитайте количество словарей определенного типа

{'att1':value1, 'att2': value2, 'colour': 'Red'} 

Атрибут colou из списка из 15 цветов maxium.

У меня более тысячи этих словарей в списке. Мне нужно выяснить, что такое популярный цвет и сколько его экземпляров? Точно так же мне нужен второй самый популярный цвет, количество его экземпляров, третий самый, четвертый и т. Д. ...

Может ли какой-нибудь причудливый пифонический синтаксис помочь мне?

+0

Что-то не очень pythonic. Для каждого coloud что-то вроде: redList = [цвет для цвета в myLIst, если myList ['colourProperty'] == 'RED'] , а затем len (redList). Я не добавлял это к оригиналу, потому что не вижу, как это помогает. – dublintech

ответ

6
from collections import defaultdict 
colours = defaultdict(int) 
for item in mylist: 
    colours[item["colour"]] +=1 

дает вам defaultdict со всеми цветами и их соответствующим номером. Отображение тех, что отсортированы, тривиально.

3

Используйте map, чтобы сопоставить каждый словарь с его цветами, а затем collections.Counter. Должно быть однострочным способом. Что-то вроде

collections.Counter(map(lambda x: x.get("color"), listofdict)) 
5

Вы можете использовать счетчик и генератор, как это:

distribution = collections.Counter(d['colour'] for d in list_of_dict) 
distribution.most_common(2) 
0
l = [] 
for x in xrange(100): 
    l.append({'att1':1, 'att2': 2, 'colour': 'Red'}) 

for x in xrange(10): 
    l.append({'att1':1, 'att2': 2, 'colour': 'Blue'}) 

colors = [i['colour'] for i in l] 

dcolors = {} 
for i in colors: 
    if not i in dcolors: 
     dcolors[i] = 0 
    dcolors[i] += 1 

print dcolors 

Я создал 100 красных и 10 синих вещей, результат печати:

{'Blue': 10, 'Red': 100} 

Вы возможно, найдет способ найти max и т. д. или отсортировать его.

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