Использование «в», чтобы соответствовать атрибут объектов Python в массиве

голоса
39

Я не помню, был ли я мечтать или нет, но я, кажется, припоминаю там быть функция, которая позволила что-то подобное,

foo in iter_attr(array of python objects, attribute name)

Я просмотрел документы, но такого рода вещи не подпадает под каких-либо очевидных перечисленных заголовков

Задан 03/08/2008 в 14:19
источник пользователем
На других языках...                            


8 ответов

голоса
38

Использование списка понимание бы построить временный список, который может съесть всю память , если последовательность разыскивается велик. Даже если последовательность не большая, создание списка означает итерацию по всей последовательности перед inможешь начать свой поиск.

Временный список может быть избежать с помощью генератора выражением:

foo = 12
foo in (obj.id for obj in bar)

Теперь, пока obj.id == 12ближе к началу bar, поиск будет быстро, даже если barбесконечно долго.

Как было предложено @ Matt, это хорошая идея , чтобы использовать , hasattrесли какой - либо из объектов barможет быть пропущен idатрибут:

foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))
Ответил 11/09/2008 в 23:42
источник пользователем

голоса
10

Вы хотите получить список объектов , которые имеют определенный атрибут? Если да, то список понимание является правильным способом сделать это.

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
Ответил 03/08/2008 в 16:59
источник пользователем

голоса
8

Вы всегда можете написать его самостоятельно:

def iterattr(iterator, attributename):
    for obj in iterator:
        yield getattr(obj, attributename)

будет работать с чем-нибудь, что перебирает, будь то кортеж, список, или любой другой.

Я люблю питон, он делает такие вещи, как это очень простые и не больше хлопот, чем необходимый, и в использовании вещи, как это очень элегантно.

Ответил 27/08/2008 в 21:13
источник пользователем

голоса
4

Функция вы думаете, наверное operator.attrgettter. Например, чтобы получить список, содержащий значение атрибута «ID» для каждого объекта:

import operator
ids = map(operator.attrgetter("id"), bar)

Если вы хотите, чтобы проверить, содержит ли список объект с идентификатором == 12, то аккуратный и эффективный (т.е. не перебирать весь список излишне) способ сделать это:

any(obj.id == 12 for obj in bar)

Если вы хотите использовать «в» с attrgetter, сохраняя при этом ленивой итерации списка:

import operator,itertools
foo = 12
foo in itertools.imap(operator.attrgetter("id"), bar)

Ответил 05/02/2011 в 09:10
источник пользователем

голоса
4

Нет, вы не мечтали. Python имеет очень отличную систему список понимание, что позволяет манипулировать списками очень элегантно, и в зависимости от того, что именно вы хотите достичь, это может быть сделано несколькими способами. В сущности, то, что вы делаете, говоря «для пункта в списке, если criteria.matches», и от того, что вы можете просто перебирать результаты или свалку результатов в новый список.

Я собираюсь шпаргалка пример из Dive Into Python здесь, потому что это довольно элегантно и они умнее , чем я. Здесь они получают список файлов в каталоге, а затем фильтровать список всех файлов , которые соответствуют критериям регулярные выражения.

    files = os.listdir(path)                               
    test = re.compile("test\.py$", re.IGNORECASE)          
    files = [f for f in files if test.search(f)]

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

Эрик Сиппл

Ответил 03/08/2008 в 15:30
источник пользователем

голоса
3

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

Если это не обязательно производительность чувствительный код, то список понимание способ должен работать. Но учтите, что это довольно неэффективно, потому что идет над каждым элементом итератор, а затем возвращается на него снова, пока не найдет то, что он хочет.

Помните, что питон имеет один из самых эффективных алгоритмов хеширования вокруг. Используйте его в своих интересах.

Ответил 27/08/2008 в 21:30
источник пользователем

голоса
3

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

т.е. «бар» представляет собой список объектов, каждый из которых имеет атрибут «ID»

Мифический функциональным образом:

foo = 12
foo in iter_attr(bar, 'id')

Список понимание способа:

foo = 12
foo in [obj.id for obj in bar]

В ретроспективе список понимание способ довольно аккуратный в любом случае.

Ответил 03/08/2008 в 17:13
источник пользователем

голоса
-1

Я думаю:

#!/bin/python
bar in dict(Foo)

Это то , что вы думаете. При попытке увидеть , если определенный ключ существует в словаре в питона (версия питона хэш - таблицы) есть два способа проверки. Во- первых это has_key()метод прикреплен к словарю и второй пример , приведенный выше. Она возвращает логическое значение.

Это должно ответить на ваш вопрос.

А теперь немного от темы , чтобы связать это с списком понимания ответом ранее заданным (для бита большей ясности). Списковые построить список из основных для цикла с модификаторами. В качестве примера (немного уточнить), способ использования in dictязыковых конструкций в списке понимание :

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

#!/bin/python
baz = dict([(key, value) for key, value in foo if bar in value])

Обратите внимание , что if bar in valueв конце утверждения **, это условие модифицирования , которое указывает список понимание только сохранить эти пары ключ-значение , которые соответствуют условным. ** В этом случае bazновый словарь , который содержит только словари , обув которые содержат бар (Надеюсь , я ничего в этом примере кода не пропустите ... вы , возможно , придется взглянуть на документацию списка понимания , найденного в docs.python.org учебники и на secnetix.de , как сайты хорошие ссылки если у вас есть вопросы в будущем.).

Ответил 03/08/2008 в 16:47
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more