2017-01-22 7 views
5

У меня есть Dict, который идет что-то вроде этого:Определения значений, которые имеют максимальное количество ключей

ip = { "1" : ['a','b'], 
     "2" : ['a','c'], 
     "3" : ['a','b','c','d'], 
     "4" : ['a','b','d','e']} 

мне нужно найти какие из элементов в наборах значений имеет максимальное количество ключей от них и также имеют предметы, перечисленные в порядке убывания. Вывод будет что-то вроде:

op = {"a":4,"b":3,"c":2,"d":2,"e":1} 

Но я где-то читал, что ДИКТ не может быть в отсортированном моде, поэтому вывод может быть кортеж тоже:

op = [('a', 4), ('b', 3), ('c', 2), ('d', 2), ('e', 1)] 

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

op = defaultdict(int) 
for k,v in ip.iteritems(): 
    for item in v: 
     op[item]+=1 
op = sorted(op.items(), key=lambda x: x[1], reverse=True) 

Есть ли более быстрый/лучший способ сделать это, чем вложенный?

+0

Можете ли вы представить свой ожидаемый результат для примера? –

+0

добавил желаемый результат. – nektar

+0

Существует такая вещь, как упорядоченный словарь ... 'из коллекции import OrderedDict'. –

ответ

3

Просто используйте Counter и chain.from_iterable

In [9]: from collections import Counter 

In [10]: from itertools import chain 

In [11]: ip = { "1" : ['a','b'], 
    ...:  "2" : ['a','c'], 
    ...:  "3" : ['a','b','c','d'], 
    ...:  "4" : ['a','b','d','e']} 

In [12]: Counter(chain.from_iterable(ip.values())) 
Out[12]: Counter({'a': 4, 'b': 3, 'c': 2, 'd': 2, 'e': 1}) 

Чтобы удалить повторяющееся значение, вы всегда можете сделать что-то вроде этого:

>>> from operator import itemgetter 
>>> sorted(Counter(chain.from_iterable(map(set, ip.values()))).items(), key=itemgetter(1), reverse=True) 
[('a', 4), ('b', 3), ('c', 2), ('d', 2), ('e', 1)] 
0

Это здесь не исправить:

sorted(op.items(), key=lambda x: x[1], reverse=True) 

Попробуйте вместо этого:

sorted(ip, key=lambda elementInDict: len(ip[elementInDict]), reverse=True) 

пример:

for elementInDict in sorted(ip, key=lambda elementInDict: len(ip[elementInDict]), reverse=True): 
    print elementInDict,