Раньше был способ сделать это, используя недокументированный факт, что во время построения списка его значение хранилось в локальной переменной с именем _[1].__self__
.Однако это перестало работать в Python 2.7 (возможно, раньше, я не обращал пристального внимания).
Вы можете делать то, что хотите, в понимании единого списка, если вы сначала настроили внешнюю структуру данных.Поскольку весь ваш псевдокод, по-видимому, работал с this_list
, он проверял его на предмет наличия в нем каждого s
- то есть теста членства - я изменил его на set
с именем seen
какоптимизация (проверка на членство в list
может быть очень медленной, если список большой).Вот что я имею в виду:
raw_data = [c for c in 'abcdaebfc']
seen = set()
def some_function(s):
seen.add(s)
return s
print [ some_function(s) for s in raw_data if s not in seen ]
# ['a', 'b', 'c', 'd', 'e', 'f']
Если у вас нет доступа к some_function
, вы можете добавить к нему вызов в своей собственной функции-обертке, которая добавит его возвращаемое значение к seen
, установленному ранее.возвращая его.
Несмотря на то, что это не было бы списком, я бы включил все это в функцию, чтобы упростить повторное использование:
def some_function(s):
# do something with or to 's'...
return s
def add_unique(function, data):
result = []
seen = set(result) # init to empty set
for s in data:
if s not in seen:
t = function(s)
result.append(t)
seen.add(t)
return result
print add_unique(some_function, raw_data)
# ['a', 'b', 'c', 'd', 'e', 'f']
В любом случае, я нахожуСтранно, что список, создаваемый в вашем псевдокоде, на который вы хотите сослаться, состоит не из подмножества raw_data
значений, а скорее является результатом вызова some_function
для каждого из них - то есть преобразованных данных - которыеестественно, возникает вопрос: что делает some_function
, так что его возвращаемое значение может соответствовать значению существующего элемента raw_data
.