У меня есть список объектов. Я хочу найти один (первый или любой другой) объект в этом списке, у которого атрибут (или результат метода - что угодно) равен value
.
Какой самый лучший способ найти его?
Вот тестовый пример:
class Test:
def __init__(self, value):
self.value = value
import random
value = 5
test_list = [Test(random.randint(0,100)) for x in range(1000)]
# that I would do in Pascal, I don't believe isn't anywhere near 'Pythonic'
for x in test_list:
if x.value == value:
print "i found it!"
break
Я думаю, что использовать генераторы и reduce()
не будет иметь никакого значения, потому что он все еще будет перебирать список.
PS .: Уравнение value
является лишь примером. Конечно, мы хотим получить элемент, который удовлетворяет любым условиям.
Ответы:
Это получает первый элемент из списка, который соответствует условию, и возвращает
None
если ни один элемент не соответствует. Это моя любимая форма с одним выражением.Тем не мение,
Наивная версия с петлевым разрывом, совершенно Pythonic - она лаконична, понятна и эффективна. Чтобы он соответствовал поведению однострочника:
Это позволит назначить
None
для ,x
если вы неbreak
из петли.источник
... if getattr(x, x.fieldMemberName) == value
. Это приведет к получению атрибутаx
с сохраненным именемfieldMemberName
и его сопоставлениюvalue
.else
предложение должно быть вfor
цикле, а неif
. (Отклонено Редактировать).Так как это не было упомянуто только для завершения. Хороший старый фильтр для фильтрации ваших фильтруемых элементов.
Функциональное программирование
Я знаю, что обычно в списках Python предпочтение отдается предпочтениям или, по крайней мере, это то, что я читаю, но я не вижу в этом проблемы, если честно. Конечно, Python не является языком FP, но Map / Reduce / Filter отлично читаются и являются наиболее стандартными из стандартных вариантов использования в функциональном программировании.
Итак, поехали. Знай свое функциональное программирование.
список условий фильтра
Это не станет легче, чем это:
источник
filter
возвращает список, который не совместим сnext
. 2 : требуется наличие определенного совпадения, иначе вы получитеStopIteration
исключение.Простой пример : у нас есть следующий массив
Теперь мы хотим найти объект в массиве с идентификатором, равным 1
next
с пониманием спискаВывод всех вышеперечисленных методов есть
{'id': 1, 'name': 'ronaldo'}
источник
Я просто столкнулся с подобной проблемой и разработал небольшую оптимизацию для случая, когда ни один объект в списке не отвечает требованию (для моего варианта использования это привело к значительному повышению производительности):
Наряду со списком test_list, я сохраняю дополнительный набор test_value_set, который состоит из значений списка, по которому мне нужно отфильтровать. Так что здесь остальная часть решения agf становится очень быстрой.
источник
Вы могли бы сделать что-то вроде этого
Вот что я использую, чтобы найти объекты в длинном массиве объектов.
источник
Вы также можете реализовать расширенное сравнение с помощью
__eq__
метода для вашегоTest
класса иin
оператора use . Не уверен, что это лучший автономный способ, но в случае, если вам нужно сравнитьTest
экземпляры, основанные наvalue
другом месте, это может быть полезно.источник
Для приведенного ниже кода xGen - это выражение автономного генератора, yFilt - объект фильтра. Обратите внимание, что для xGen возвращается дополнительный параметр None, а не выбрасывает StopIteration, когда список исчерпан.
Вывод:
источник