от
Я не помню, был ли я сплю или нет, но я, кажется, припоминаю, что там была функция, которая позволяла что-то вроде:
foo in iter_attr(array of python objects, attribute name)
Я просмотрел документы, но такого рода вещи не подпадают под какой-либо очевидной перечислены заголовки

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.

9 Ответы

0 голосов
от
Я не помню, был ли я сплю или нет, но я, кажется, припоминаю, что там была функция, которая позволяла что-то вроде:
foo in iter_attr(array of python objects, attribute name)
Я просмотрел документы, но такого рода вещи не подпадают под какой-либо очевидной перечислены заголовки
0 голосов
от
Используя список понимание будет построить временный список, который может съесть всю память, если последовательность ищется большая. Даже если последовательность не большие, дом в списке означает перебирать всю последовательность до
in
может начать его поиск. Временный перечень можно избежать с помощью генератора выражений:
foo = 12
foo in (obj.id for obj in bar)
Теперь, пока
obj.id == 12
в начале
bar
, поиск будет быстрым, даже если
bar
бесконечно долго. Как @Мэтт предложил, это хорошая идея, чтобы использовать
hasattr
если любой из объектов в
bar
отсутствует атрибут
id
:
foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))
0 голосов
от
Вы ищете, чтобы получить список объектов, которые имеют определенный атрибут? Если это так, осознание списка-это правильный способ сделать это.
result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
0 голосов
от
вы всегда можете написать его самостоятельно:
def iterattr(iterator, attributename):
    for obj in iterator:
        yield getattr(obj, attributename)
будет работать со всем, что проходит, будь то кортеж, список или что угодно. Я люблю питон, он делает вещи, как это очень простой и никаких больше хлопот, чем необходимо, и использовать вещи, как это очень элегантно.
0 голосов
от
Нет, это был не сон. Python имеет очень удобное системное осмысление список, который позволяет манипулировать списками довольно элегантно, и в зависимости от того, чего вы хотите достичь, это может быть сделано несколькими способами. В сущности, то, что вы делаете, говоря: "по пункту в списке, если критерии.играм", и от этого вы можете просто перебрать результаты и вывести результаты в новый список. Я собираюсь кроватку пример погружения в Python здесь, потому что это довольно элегантный и они умнее меня. Здесь они получают список файлов в каталоге, а затем фильтрация списка для всех файлов, которые соответствуют обычным критериям выражение.
    files = os.listdir(path)                               
    test = re.compile("test\.py$", re.IGNORECASE)          
    files = [f for f in files if test.search(f)]
Вы можете сделать это без регулярных выражений, за ваш пример, за что, где ваше выражение в конце возвращает true на матч. Есть и другие варианты, как через фильтр (функция), но если бы мне пришлось выбрать, я бы пошел с этим. Эрик Sipple
0 голосов
от
Функции вы думаете, вероятно
operator.attrgettter
. Например, чтобы получить список, который содержит значение атрибута для каждого объекта "идентификатор":
import operator
ids = map(operator.attrgetter("id"), bar)
Если вы хотите проверить, является ли список содержит объект с id == 12, затем аккуратно и эффективно (т. е. не перебирать весь список без надобности) способ сделать это:
any(obj.id == 12 for obj in bar)
Если вы хотите использовать 'в' с attrgetter, сохраняя ленивый вариант списка:
import operator,itertools
foo = 12
foo in itertools.imap(operator.attrgetter("id"), bar)
0 голосов
от
То, что я думал может быть достигнуто, используя списочные включения, но я думал, что есть функция, которая сделала это немного по-аккуратнее пути. т. е. 'бар' - это список объектов, каждый из которых имеет идентификатор атрибута'' Мифический функциональным способом:
foo = 12
foo in iter
0 голосов
от
Если вы планируете поиск ничего отдаленно приличного размера, лучшим вариантом будет использовать словарь или набор. В противном случае, придется перебирать каждый элемент итератора, пока вы не получите то, что вы хотите. Если это не обязательно чувствительных к производительности кода, то в списке понимания как должно работать. Но учтите, что это довольно неэффективно, так как идет за каждый элемент итератора, а затем возвращается снова, пока не найдет то, что хочет. Помните, что Python имеет один из самых эффективных алгоритмов хэширования вокруг. Использовать его в своих интересах.
0 голосов
от
Я думаю:
#!/bin/python
bar in dict(Foo)
Это то, что вы думаете. При попытке определить, существует ли определенный ключ в словарь в Python (версия Python или хэш-таблицу) есть два способа проверить. Первый метод
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
это новый словарь, который содержит только словари из Foo, который содержит бар (надеюсь я ничего не пропустил в этом примере кода... Вы можете взглянуть на список понимания документации docs.python.org учебники и по secnetix.de оба сайты хороши ссылках, если у вас возникнут вопросы в будущем.).
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...