Операции со списком Python - PullRequest
       5

Операции со списком Python

5 голосов
/ 19 августа 2011

Это код, который у меня есть, но он выглядит как не Python.

def __contains__(self, childName):
    """Determines if item is a child of this item"""
    for c in self.children:
        if c.name == childName:
            return True
    return False

Какой самый «питонский» способ сделать это?Использовать функцию лямбда-фильтра?По некоторым причинам очень немногие примеры в сети на самом деле работают со списком объектов, где вы сравниваете свойства, они всегда показывают, как это сделать, используя список реальных строк, но это не очень реалистично.

Ответы [ 3 ]

7 голосов
/ 19 августа 2011

Я бы использовал:

return any(childName == c.name for c in self.children)

Это короткий и имеет то же преимущество, что и ваш код, что он остановится, когда найдет первое совпадение.

Если выЕсли вы делаете это часто, и скорость - это проблема, вы можете создать новый атрибут, который представляет собой набор дочерних имен, а затем просто использовать return childName in self.childNames, но затем вам нужно обновить методы, которые изменяют дочерние элементы, чтобы поддерживать актуальность childNames.

5 голосов
/ 19 августа 2011

Я бы сделал это:

return childName in [c.name for c in self.children]
1 голос
/ 19 августа 2011

Один способ сделать это с помощью лямбды:

from itertools import imap
return any(imap(lambda c: c.name == childName, self.children))

, но оригинальное решение кажется мне более понятным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...