Действительно ли возможно определить рекурсивное понимание списка в Python?
Возможно упрощенный пример, но что-то вроде:
nums = [1, 1, 2, 2, 3, 3, 4, 4]
willThisWork = [x for x in nums if x not in self] # self being the current comprehension
Похож на что-нибудь это возможное?
Нет, не существует (задокументированного, надежного, стабильного, ... ;-) способа обозначить "текущее понимание". Вы можете просто использовать цикл:
res = []
for x in nums:
if x not in res:
res.append(x)
, конечно, это очень дорого (O (N в квадрате)), поэтому вы можете оптимизировать его с помощью вспомогательного набора
(я предполагаю, что сохранение порядка элементов в res
совпадает с элементами в nums
, иначе set (nums)
подойдет вам; -) ...:
res = []
aux = set()
for x in nums:
if x not in aux:
res.append(x)
aux.add(x)
это невероятно быстрее для очень длинных списков (O (N) вместо N в квадрате).
Изменить : в Python 2.5 или 2.6 vars () ['_ [1]']
может действительно работать в той роли, которую вы хотите для self
(для non-nested listcomp) ... вот почему я уточнил свое утверждение, пояснив, что нет документированного, надежного, стабильного способа доступа к «создаваемому списку» - этому своеобразному недокументированному «имени» '_ [1]'
(намеренно выбран не в качестве действительного идентификатора ;-) - это вершина «артефактов реализации», и любой код, основанный на нем, заслуживает того, чтобы избавиться от его невзгод ;-).
Нет.
Но похоже, что вы пытаетесь составить список уникальных элементов в числах.
Вы можете использовать набор
:
unique_items = set(nums)
Обратите внимание, что элементы в числах должны быть хешируемыми.
Вы также можете сделать следующее. Что, насколько я понимаю, близко к вашей первоначальной идее. Но это не так эффективно, как создание набора
.
unique_items = []
for i in nums:
if i not in unique_items:
unique_items.append(i)
Не уверен, что это то, что вы хотите, но вы можете написать понимание вложенных списков:
xs = [[i for i in range(1,10) if i % j == 0] for j in range(2,5)]
assert xs == [[2, 4, 6, 8], [3, 6, 9], [4, 8]]
Из вашего примера кода вы, кажется, хотите просто исключить дубликаты, которые можно делать с наборами:
xs = sorted(set([1, 1, 2, 2, 3, 3, 4, 4]))
assert xs == [1, 2, 3, 4]
Сделайте это:
nums = [1, 1, 2, 2, 3, 3, 4, 4]
set_of_nums = set(nums)
unique_num_list = list(set_of_nums)
или даже так:
unique_num_list = sorted(set_of_nums)
нет. Это не сработает, нет self
, на который можно сослаться во время выполнения понимания списка.
И главная причина, конечно, в том, что списковые вычисления не предназначены для такого использования.