Рекурсивное понимание списка в Python?

Действительно ли возможно определить рекурсивное понимание списка в 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

Похож на что-нибудь это возможное?

34
задан SilentGhost 14 April 2010 в 15:06
поделиться

5 ответов

Нет, не существует (задокументированного, надежного, стабильного, ... ;-) способа обозначить "текущее понимание". Вы можете просто использовать цикл:

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]' (намеренно выбран не в качестве действительного идентификатора ;-) - это вершина «артефактов реализации», и любой код, основанный на нем, заслуживает того, чтобы избавиться от его невзгод ;-).

33
ответ дан 27 November 2019 в 17:00
поделиться

Нет.

Но похоже, что вы пытаетесь составить список уникальных элементов в числах.

Вы можете использовать набор :

unique_items = set(nums)

Обратите внимание, что элементы в числах должны быть хешируемыми.

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

unique_items = []
for i in nums:
    if i not in unique_items:
        unique_items.append(i)
1
ответ дан 27 November 2019 в 17:00
поделиться

Не уверен, что это то, что вы хотите, но вы можете написать понимание вложенных списков:

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]
1
ответ дан 27 November 2019 в 17:00
поделиться

Сделайте это:

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)
1
ответ дан 27 November 2019 в 17:00
поделиться

нет. Это не сработает, нет self, на который можно сослаться во время выполнения понимания списка.

И главная причина, конечно, в том, что списковые вычисления не предназначены для такого использования.

1
ответ дан 27 November 2019 в 17:00
поделиться
Другие вопросы по тегам:

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