Как фильтровать словарь в соответствии с произвольной функцией условия?

У меня есть словарь точек, скажем:

>>> points={'a':(3,4), 'b':(1,2), 'c':(5,5), 'd':(3,3)} 

Я хочу создать новый словарь со всеми точками, чьи значения x и y меньше 5, то есть точки «a», «b» и «d».

Согласно книге , каждый словарь имеет функцию items() , которая возвращает список (key, pair) кортежей:

 >>> points.items() [('a', (3, 4)), ('c', (5, 5)), ('b', (1, 2)), ('d', (3, 3))] 

Поэтому я написал это:

 >>> for item in [i for i in points.items() if i[1][0]<5 and i[1][1]<5]: ... points_small[item[0]]=item[1] ... >>> points_small {'a': (3, 4), 'b': (1, 2), 'd': (3, 3)} 

Есть ли более элегантный способ? Я ожидал, что Python будет иметь супер-awesome dictionary.filter(f) функцию …

  • python: в чем разница между pythonbrew и virtualenv?
  • django redirect после входа в систему не работает «next» не публикует?
  • Включение завершения кода во встроенном интерпретаторе Python
  • Наследование от неизменяемых типов
  • из . import _methods ImportError: невозможно импортировать имя '_methods' в cx-freeze python
  • Объединение пользовательских функций с помощью CountVectorizer
  • pytz и astimezone () не могут применяться к наивному дате
  • Отправка запроса JSON с помощью Python
  • 7 Solutions collect form web for “Как фильтровать словарь в соответствии с произвольной функцией условия?”

    В настоящее время в Python 2.7 и выше вы можете использовать понимание dict:

     {k: v for k, v in points.iteritems() if v[0] < 5 and v[1] < 5} 

    И в Python 3:

     {k: v for k, v in points.items() if v[0] < 5 and v[1] < 5} 
     dict((k, v) for k, v in points.items() if all(x < 5 for x in v)) 

    Вы можете выбрать вызов .iteritems() вместо .items() если вы находитесь в Python 2, и points могут иметь много записей.

    all(x < 5 for x in v) могут быть излишними, если вы точно знаете, что каждая точка всегда будет только 2D (в этом случае вы можете выразить одно и то же ограничение с помощью a and ), но она будет работать нормально ;-).

     points_small = dict(filter(lambda (a,(b,c)): b<5 and c < 5, points.items())) 
     dict((k, v) for (k, v) in points.iteritems() if v[0] < 5 and v[1] < 5) 

    Я думаю, что ответ Alex Martelli определенно является самым изящным способом сделать это, но просто хотел добавить способ удовлетворить ваши потребности в супер удивительном dictionary.filter(f) метод в стиле Pythonic:

     class FilterDict(dict): def __init__(self, input_dict): for key, value in input_dict.iteritems(): self[key] = value def filter(self, criteria): for key, value in self.items(): if (criteria(value)): self.pop(key) my_dict = FilterDict( {'a':(3,4), 'b':(1,2), 'c':(5,5), 'd':(3,3)} ) my_dict.filter(lambda x: x[0] < 5 and x[1] < 5) 

    В основном мы создаем класс, который наследует от dict , но добавляет метод фильтра. Нам нужно использовать .items() для фильтрации, так как использование .iteritems() то время как разрушающая итерация вызовет исключение.

     >>> points = {'a': (3, 4), 'c': (5, 5), 'b': (1, 2), 'd': (3, 3)} >>> dict(filter(lambda x: (x[1][0], x[1][1]) < (5, 5), points.items())) {'a': (3, 4), 'b': (1, 2), 'd': (3, 3)} 
     dict((k, v) for (k, v) in points.iteritems() if v[0] < 5 and v[1] < 5) 
    Interesting Posts

    Каков самый простой способ конвертировать ndarray в cv :: Mat?

    Как проверить, какую версию Numpy я использую?

    Python: получить позицию самого большого элемента в массиве numpy

    Анализатор времени на естественном языке

    Представить экземпляр разных классов с тем же базовым классом в pyyaml

    django UnreadablePostError: ошибка чтения данных запроса

    Сделать виджет Tkinter в фокусе

    Python argparse parse_args в глобальное пространство имен (или причина, по которой это плохая идея)

    Python: TypeError: не может конкатенировать объекты 'str' и 'int'

    Навигация вручную с помощью курсора через вложенные списки, только предоставляя «left ()» и «right ()» в качестве команд?

    Получение двух строк переменной из URL в Django

    Как автоматизировать просмотр с помощью python?

    Python: «неожиданный отступ», но отступы кажутся правильными и последовательными

    python websocket handshake (RFC 6455)

    Есть ли эквивалент python утилиты unix «file»?

    Python - лучший язык программирования в мире.