Python, эквивалентный из maplist?

Просто замените


на


в XML-файлах вашего проекта.

Вы можете использовать Заменить в пути ярлык в Mac (⇧⌘F или ⇧⌘R) и Windows (Ctrl + Shift + R)

enter image description here

11
задан Jacob Gabrielson 27 May 2009 в 18:20
поделиться

8 ответов

Вы можете написать для этого небольшую функцию

def maplist(func, values):
    return [map(func, values[i:]) for i in xrange(len(values))]

>>> maplist(lambda a: a* 2, [1,2,3])
[[2, 4, 6], [4, 6], [6]]

[Edit]

если вы хотите применить функцию к подспискам, вы можете изменить функцию на это:

def maplist(func, values):
    return [func(values[i:]) for i in xrange(len(values))]

>>> maplist(lambda l: list(reversed(l)), [1,2,3])
[[3, 2, 1], [3, 2], [3]]
11
ответ дан 3 December 2019 в 04:53
поделиться

Как упоминалось @Cybis и другими, вы можете ' t сохранить сложность O (N) со списками Python; вам нужно будет создать связанный список. Рискуя доказать 10-е правило Гринспана , вот такое решение:

class cons(tuple):
    __slots__=()

    def __new__(cls, car, cdr):
        return tuple.__new__(cls, (car,cdr))

    @classmethod
    def from_seq(class_, l):
        result = None
        for el in reversed(l):
            result = cons(el, result)
        return result

    @property
    def car(self): return self._getitem(0)

    @property
    def cdr(self): return self._getitem(1)

    def _getitem(self, i):
        return tuple.__getitem__(self, i)

    def __repr__(self):
        return '(%s %r)' % (self.car, self.cdr)

    def __iter__(self):
        v = self
        while v is not None:
            yield v.car
            v = v.cdr

    def __len__(self):
        return sum(1 for x in self)

    def __getitem__(self, i):
        v = self
        while i > 0:
            v = v.cdr
            i -= 1
        return v.car

def maplist(func, values):
    result = [ ]
    while values is not None:
        result.append(func(values))
        values = values.cdr
    return result

Тестирование дает:

>>> l = cons.from_seq([1,2,3,4])
>>> print l
(1 (2 (3 (4 None))))
>>> print list(l)
[1, 2, 3, 4]
>>> print maplistr(lambda l: list(reversed(l)), cons.from_seq([1,2,3]))
[[3, 2, 1], [3, 2], [3]]

РЕДАКТИРОВАТЬ: Вот решение на основе генератора, которое в основном решает ту же проблему без использования связанных списки:

import itertools

def mapiter(func, iter_):
    while True:
        iter_, iter2 = itertools.tee(iter_)
        iter_.next()
        yield func(iter2)

Результаты тестирования:

>>> print list(mapiter(lambda l: list(reversed(list(l))), [1,2,3]))
[[3, 2, 1], [3, 2], [3]]
6
ответ дан 3 December 2019 в 04:53
поделиться

Фууууу ... Нарезка списка - это операция линейного времени. Все опубликованные решения имеют временную сложность O (n ^ 2). Я считаю, что список отображения Lisp имеет O (n).

Проблема в том, что тип списка Python не является связанным списком. Это массив с динамически изменяемым размером (то есть, как "векторный" тип C ++ STL).

Если для вас важно поддерживать линейную временную сложность, невозможно создать функцию «maplist» над списками Python. Было бы лучше изменить ваш код для работы с индексами в списке или преобразовать список в фактический связанный список (по-прежнему операция с линейным временем, но с большими накладными расходами).

3
ответ дан 3 December 2019 в 04:53
поделиться

это работает как ваш пример (я изменил код reyjavikvi)

def maplist(func, l):
    result=[]
    for i in range(len(l)):
        result.append(func(l[i:]))
    return result
1
ответ дан 3 December 2019 в 04:53
поделиться

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

>>> def p(x): return x
>>> l = range(4)[1:]
>>> [p([i:]) for i in range(len(l))]
[[1, 2, 3], [2, 3], [3]]

Что вы можете использовать для самостоятельного определения maplist:

>>> def maplist(p, l): return [p([i:]) for i in range(len(l))]
>>> maplist(p, l)
[[1, 2, 3], [2, 3], [3]]
1
ответ дан 3 December 2019 в 04:53
поделиться

Изменение ответа Аарона:

In [8]: def maplist(p, l): return [p([x for x in l[i:]]) for i in range(len(l))]
   ...: 

In [9]: maplist(lambda x: x + x, [1,2,3])
Out[9]: [[1, 2, 3, 1, 2, 3], [2, 3, 2, 3], [3, 3]]
0
ответ дан 3 December 2019 в 04:53
поделиться

Я думаю, что нет, но может работать следующая функция:

def maplist(func, l):
    for i in range(len(l)):
        func(l[i:])
-1
ответ дан 3 December 2019 в 04:53
поделиться

O (N) реализация maplist () для связанных списков

maplist = lambda f, lst: cons(f(lst), maplist(f, cdr(lst))) if lst else lst

См. Вопрос Связанный список Python .

1
ответ дан 3 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

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