Сжатие вызова участника «n» -time

Существует ли какой-либо неявный способ вызова члена n раз на объект?

Я думал о каком-то map/reduce/lambda , но я не мог понять, как это сделать – если это возможно.

Чтобы добавить контекст, я использую BeautifulSoup , и я извлекаю некоторые элементы из таблицы html; Я извлекаю некоторые элементы, а затем, последний.

Поскольку у меня есть:

 # First value print value.text # Second value value = value.nextSibling print value.text # Ninth value for i in xrange(1, 7): value = value.nextSibling print value.text 

Мне было интересно, есть ли какой-нибудь lambda подход – или что-то еще – это позволит мне сделать это:

 # Ninth value ((value = value.nextSibling) for i in xrange(1, 7)) print value.text 

PS: Нет, нет никаких проблем с подходом, за исключением того, что мне действительно нравятся решения с одним слоем, и это будет очень хорошо в моем коде.

6 Solutions collect form web for “Сжатие вызова участника «n» -time”

У меня есть сильное предпочтение для цикла, но вы можете использовать reduce :

 >>> class Foo(object): ... def __init__(self): ... self.count = 0 ... def callme(self): ... self.count += 1 ... return self ... >>> a = Foo() >>> reduce(lambda x,y:x.callme(),range(7),a) <__main__.Foo object at 0xec390> >>> a.count 7 

Вам нужен однострочный эквивалент:

 for i in xrange(1, 7): value = value.nextSibling 

Это одна строка:

 for i in xrange(1, 7): value = value.nextSibling 

Если вы ищете что-то более функциональное, то, что вы действительно хотите, это функция compose , поэтому вы можете создавать callme() (или attrgetter('my_prop') или что-то еще) 7 раз.

В случае BS вы можете использовать nextSiblingGenerator() с itertools.islice чтобы получить n-й брат. Он также будет обрабатывать ситуации, в которых нет n-го элемента.

 from itertools import islice nth = 7 next(islice(elem.nextSiblingGenerator(), nth, None), None) 

Отказ от ответственности: eval – это зло.

 value = eval('value' + ('.nextSibling' * 7)) 

Ах! Но reduce не доступно в Python3, по крайней мере, не как встроенное.

Итак, вот моя попытка, переносимая на Python2 / 3 и основанная на неудачной попытке OP:

 [globals().update(value=value.nextSibling) for i in range(7)] 

Это предполагает, что value является глобальной переменной. Если значение является переменной-членом, тогда вместо этого напишите:

 [self.__dict__.update(value=value.nextSibling) for i in range(7)] 

Вы не можете использовать locals() потому что понимание списка создает вложенную локальную область, поэтому реальные locals() недоступны напрямую. Однако вы можете записать его с небольшой работой:

 (lambda loc : [loc.update(x=x.nextSibling) for i in range(7)])(locals()) 

Или проще, если вы не возражаете дублировать количество строк:

 loc = locals() [loc.update(value=value.nextSibling) for i in range(7)] 

Или, если вам действительно нравятся однострочники:

 loc = locals() ; [loc.update(value=value.nextSibling) for i in range(7)] 

Да, Python может использовать ; тоже 😎

ОБНОВЛЕНИЕ :

Еще одна причудливая вариация, теперь с map вместо понимания списка:

 list(map(lambda d : d.update(value=value.nextSibling), 7 * [locals()])) 

Обратите внимание на умное использование умножения списка для захвата текущих locals() и одновременного создания начального итеративного.

Самый прямой способ написать это:

 value = reduce(lambda x, _: x.nextSibling, xrange(1,7), value) 
  • TypeError: возвращаемые массивы должны быть из ArrayType, используя lambdify of sympy в python
  • Внешние переменные в лямбда-функциях в Python
  • Связывание Python lambda с локальными значениями
  • Эффективно вычислять частоту слов в строке
  • lambda in for loop принимает последнее значение
  • Python Tkinter OptionMenu добавляет команду нескольким OptionMenus
  • в чем причина использования _defaults и лямбда в python для разработки openerp?
  • Удаление дубликатов с использованием только лямбда-функций
  • Различия между functools.partial и аналогичной лямбдой?
  • lambda как аргумент для фильтра jinja2?
  • Как установить pymysql на AWS лямбда
  • Python - лучший язык программирования в мире.