Есть ли способ извлечь ключ из словаря с помощью метода фильтрации - PullRequest
0 голосов
/ 27 декабря 2018

Я установил класс коллекции и создал объект, содержащий словарь.Я создал метод с именем pluck (self, key), который должен возвращать новую коллекцию со всеми значениями отправленного мной ключа, и я использую другой метод, который я создал ранее (map и filter - оба метода коллекции).

class Collection (объект):

def __init__(self,iterable = None):
    # param iterable: imutable collection
    if iterable == None:
        self.Iterable = ()
    else:
        self.Iterable = tuple(iterable)
    return None


def map(self, *callbacks):
    '''
    :param callbacks: List of function to apply on each element in 'self.Iterable'
    :return: New mapped collection
    '''
    c =Collection(self.Iterable)
    tmp = Collection()
    for item in callbacks:
        for item2 in c.Iterable:
            tmp = tmp.append(item(item2))
        c = Collection(tmp.Iterable)
    return c


def filter(self, *callbacks):
    '''
    :param callbacks: List of function to apply on each element in 'self.Iterable'
    :return:  New filtered collection
    '''
    return Collection(item for item in self.Iterable if CallbacksFilter(item, callbacks) == True)


def CallbacksFilter(item, callback):
    for f in callback:
        if f(item) == False:
            return False
    return True

, когда я пытаюсь запустить метод pluck:

def pluck(self, key):

    return self.values() if type(self.first()) is not dict else Collection(self.Iterable).filter(self.map(lambda x, y: dict([(i,x[i]) for i in x if i in set(y)])))


c3 = Collection([{'name': 'Joe', 'age': 20}, {'name': 'Jane', 'age': 13}])
c3.pluck('age')

Я ожидаю вывода «Collection (20,13)»но я получаю эту ошибку:

TypeError: () отсутствует 1 обязательный позиционный аргумент: 'y'

Как я могу исправить эту ошибку?

Примечание. Если внутренние элементы не являются словарями, возвращается копия текущей коллекции.

1 Ответ

0 голосов
/ 31 декабря 2018

Метод, который я написал, неверен и не возвращает никакого результата, как я уже упоминал выше.

def pluck(self, key):

    return self.values() if type(self.first()) is not dict else Collection(self.Iterable).filter(self.map(lambda x, y: dict([(i,x[i]) for i in x if i in set(y)])))

Метод Map возвращает результат, применяя функцию лямбда, данную ему в каждом словаре коллекции.

def map(self, *callbacks):
'''
:param callbacks: List of function to apply on each element in 'self.Iterable'
:return: New mapped collection
'''
c =Collection(self.Iterable)
tmp = Collection()
for item in callbacks:
    for item2 in c.Iterable:
        tmp = tmp.append(item(item2))
    c = Collection(tmp.Iterable)
return c

Поэтому, когда мы запускаем следующий код:

def pluck(self, key):
    '''
    :param key: Dictionary key (13)
    :return: Return a new Collection with value of each key.
    '''
         return "Collection{}".format(Collection(self.map(lambda index: index[key])).Iterable)

c3 = Collection([{'name': 'Joe', 'age': 20}, {'name': 'Jane', 'age': 13}])
c3.pluck('age')

, мы получаем правильный результат:

Коллекция (20,13)

...