Нахождение максимального значения в словаре, содержащем смешанные элементы в Python - PullRequest
0 голосов
/ 21 сентября 2010

У меня есть словарь с целым числом или набором целых чисел в качестве значения.Как найти максимальное целое число, присутствующее в значениях диктов?

Пример:

x1 = {0:2, 2:1, 3:(1, 2), 20:3}

должен возвращать 3 и

x2 = {0:2, 2:1, 3:(1, 5), 20:3}

должен возвращать 5

Ответы [ 6 ]

3 голосов
/ 21 сентября 2010

Однострочник:

max(max(v) if isinstance(v, collections.Iterable) else v for v in d.itervalues())

Требуется минимум Python 2.6 из-за collections.Iterable ABC.

1 голос
/ 21 сентября 2010

Это моя версия одного лайнера, не нуждающегося в 2.6:

x1 = {0:2, 2:1, 3:(1, 2), 20:3}
x2 = {0:2, 2:1, 3:(1, 5), 20:3}
print max(max(values) if hasattr(values,'__iter__') else values for values in x1.values()) 
print max(max(values) if hasattr(values,'__iter__') else values for values in x2.values()) 

Вывод:

3
5

ОДНАКО Я настоятельно рекомендую перейти к началу этихзначения и измените хранение целых чисел на одноэлементных кортежей . Затем вы можете использовать более чистый код:

x1 = {0:(2,), 2:(1,), 3:(1, 2), 20:(3,)}
x2 = {0:(2,), 2:(1,), 3:(1, 5), 20:(3,)}
for x in (x1,x2):
    print max(max(values) for values in x.values())
1 голос
/ 21 сентября 2010
max(max(k,max(v) if isinstance(v,collections.Iterable) else v) for k,v in x1.items())

Другой однострочник не учитывает ключи.

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

РЕДАКТИРОВАТЬ: Выше было чушь. Спасибо @SilentGhost за указание на это.

0 голосов
/ 21 сентября 2010

Предполагая правильный результат для x1 = 4;

def maxOfMixedDict(x):
    max = 0
    for key, value in x.items():
        if(key > max):
            max = key
        try:
            for v2 in value:
                if(v2 > max):
                    max = v2
        except TypeError, e:
            pass

    return max
0 голосов
/ 21 сентября 2010

Вам нужна общая функция flatten(). Как ни странно, стандартная библиотека Python не обеспечивает ее - даже в itertools - но поиск в Google должен дать вам реализацию. Если вы не против того, чтобы быть потенциально обратно несовместимым, вы можете import "частную" реализацию из tkinter:

from _tkinter import _flatten as flatten

def mixed_max(d):
    return max(flatten(d.items()))

mixed_max({0: 2, 2: 1, 3: (1,2), 4: 0}) # => 4
mixed_max({0: 2, 2: 1, 3: (1,5), 4: 0}) # => 5
0 голосов
/ 21 сентября 2010

Вы можете попробовать этот подход:

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

Примерно так:

def maxofdict(x):
   s = set()
   for v in x.values():
      if hasattr(v, '__len__'):
         s.update(v)
      else:
         s.add(v)
   return max(s)
...