Используя 'в' соответствовать атрибуту Python возражает в массиве

вы можете попробовать это намного лучше

import sys

class Logger(object):
    def __init__(self, filename="Default.log"):
        self.terminal = sys.stdout
        self.log = open(filename, "a")

    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)

sys.stdout = Logger("yourlogfilename.txt")
print "Hello world !" # this is should be saved in yourlogfilename.txt
43
задан James A. Rosen 24 August 2008 в 03:11
поделиться

7 ответов

Используя список понимание создало бы временный список, который мог съесть всю Вашу память, если искавшая последовательность является большой. Даже если последовательность не является большой, создавание списка означает выполнять итерации по всей последовательности, прежде чем 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'))
41
ответ дан Will Harris 23 September 2019 в 12:42
поделиться

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

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
12
ответ дан Matt 23 September 2019 в 12:42
поделиться

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

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

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

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

10
ответ дан dwestbrook 23 September 2019 в 12:42
поделиться

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

т.е. 'панель' список объектов, все из которых имеют атрибут 'идентификатор'

мифический функциональный путь:

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

понимание списка путь:

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

Ретроспективно понимание списка путь довольно аккуратен так или иначе.

5
ответ дан Brendan 23 September 2019 в 12:42
поделиться

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

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

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

3
ответ дан Jason Baker 23 September 2019 в 12:42
поделиться

Я думаю:

#!/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 новый словарь, который содержит только словари от нечто, которые содержат панель (Надо надеяться, я ничего не пропустил в том примере кода..., Вам, вероятно, придется смотреть на документацию понимания списка, найденную в учебные руководства docs.python.org и в secnetix.de , оба сайта являются хорошими ссылками, если у Вас есть вопросы в будущем.).

0
ответ дан akdom 23 September 2019 в 12:42
поделиться

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

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

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

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

Eric Sipple

7
ответ дан Shadow Wizard 23 September 2019 в 12:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: