Кэширование значений в Python перечисляет понимания

URI файлового протокола похожи на этот файл

: // [HOST] / [PATH]

, поэтому вы часто видите URL-адреса файлов, например, этот файл (3 косые черты): /// C: \ путь ...

Итак, если хост - server01, вам нужен файл

: // server01 / folder / path ....

Это соответствует странице википедии в файле: // protocol и проверяется с помощью метода .NET Uri.IsWellFormedUriString.

5
задан Kai 9 June 2009 в 18:57
поделиться

4 ответа

Если вы хотите остаться с пониманием списка / итератора вместо использования фильтра , вы можете просто использовать:

resources = [file_obj
             for file_obj in (obj.get("file") for obj in iterator)
             if file_obj is not None]
6
ответ дан 18 December 2019 в 09:52
поделиться
resources = filter(None, (obj.get("file") for obj in iterator))

См. Документацию по фильтру , чтобы узнать, как предоставить собственную функцию оценки. Передача None для функции (как указано выше) отфильтровывает все значения, которые не соответствуют действительности.

Если obj.get () возвращает объект, который имеет странный метод __ nonzero __ , тогда вам нужно будет передать lambda obj: obj! = None , чтобы получить тот же результат, что и исходный код.

9
ответ дан 18 December 2019 в 09:52
поделиться

Попробуйте что-то вроде этого:

resources = filter( lambda x: x is not None, [obj.get("file") for ob jin iterator])
1
ответ дан 18 December 2019 в 09:52
поделиться

Создать временный dict для хранения значений. Затем создайте функцию, которая использует этот dict в качестве кеша, и используйте эту функцию в понимании списка, например:

obj_cache = {}

def cache_get (target, key):
    if (target, key) not in obj_cache: obj_cache[(target, key)] = target.get(key)
    return obj_cache[(target, key)]

resources = [cache_get(obj, "file") for obj in iterator if cache_get(obj, "file") != None]

Кроме того, вы, вероятно, уже это знаете (и если да, проигнорируйте этот ответ), но если только obj. get ("file") выполняет вызов базы данных, открывает файл, делает запрос по сети или делает что-то еще потенциально дорогостоящее, вызов его дважды за итерацию вместо одного, вероятно, безвреден, поскольку вы добавляете только O ( n) на ваш счет.

1
ответ дан 18 December 2019 в 09:52
поделиться
Другие вопросы по тегам:

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