Создать временный диктат для хранения значений. Затем создайте функцию, которая использует этот 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 ("файл") не выполняет вызов базы данных, открывает файл, делает запрос по сети или выполняет что-то еще потенциально дорогое, вызывать его дважды за итерацию, а не один раз, вероятно, безвредно, поскольку вы только добавляете O (n) к своей стоимости.