Как разделить список строк и вернуть кортежи с помощью рекурсии? - PullRequest
1 голос
/ 14 апреля 2020

Одна функция, с которой у меня возникают проблемы, это split_list, где я должен разделить список на три кортежа, каждый из которых содержит strlist, через рекурсию. Первый кортеж со строками должен начинаться с гласного, второй кортеж со строками должен начинаться с согласного, а третий кортеж со строками не должен начинаться с буквенного символа.

class Node:
    def __init__(self, value, rest):
        self.value = value
        self.rest = rest
    def __eq__(self, other):
        return ((type(other) == Node)
          and self.value == other.value
          and self.rest == other.rest
        )
    def __repr__(self):
        return ("Node({!r}, {!r})".format(self.value, self.rest))

# a StrList is one of
# - None, or
# - Node(string, StrList)

def split_list(strlist):
    if strlist is None:
       return (None, None, None)
    res = split_list(strlist.rest)
    if strlist.value or res(strlist.value) == 'AEIOUaeiou':
       return (Node(strlist.value, res[0]), res[1], res[2])
    if strlist.value or res(strlist.value) != 'AEIOUaeiou':
       return (res[0], Node(strlist.value, res[1]), res[2])
    if strlist.value.isalpha() or res(strlist.value) == False:
       return (res[0], res[1], Node(strlist.value, res[2]))

Это то, что у меня есть в настоящее время, но основная проблема заключается в том, что я не получаю правильную информацию при запуске своих модульных тестов. У меня проблема с AssertionError.

Примеры:

strlist = Node("xyz", Node("Abc", Node("49ers", None)))
self.assertEqual(split_list(strlist),(Node('Abc', None), Node('xyz', None), Node('49ers', None)))

strlist = Node("Yellow", Node("abc", Node("$7.25", Node("lime", Node("42", Node("Ethan", None))))))
self.assertEqual(split_list(strlist),(Node('abc', Node("Ethan", None)), Node('Yellow', Node("lime", None)), Node('$7.25', Node("42", None))))

Вывод:

AssertionError: Tuples differ: (Node('Yellow', Node('abc', Node('$7.25', Node('[50 chars]None) != (Node('abc', Node('Ethan', None)), Node('Yellow'[50 chars]ne)))

Может кто-нибудь выяснить проблему? Я был бы благодарен.

1 Ответ

0 голосов
/ 15 апреля 2020

Вы должны использовать рекурсию только для части прохождения. Рекурсивная функция не должна содержать 3 определенных c и различных условий процесса.

Что вы можете сделать, так это написать generi c функцию фильтра узла, которая создаст новую цепочку узлов и использует ее для сборки вашего кортежа , Без указанных условий c эту функцию было бы очень просто и легко протестировать:

def filter(self,condition): # on the Node class
    nextFound = self.rest.filter(condition) if self.rest else None
    return Node(self.value,nextFound) if condition(self) else nextFound 

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

def split_list(strlist):
    return ( strlist.filter(lambda n:n.value[:1].upper() in "AEIOU"), 
             strlist.filter(lambda n:n.value[:1].upper() in "BCDFGHJKLMNPQRSTVWXYZ"), 
             strlist.filter(lambda n:not n.value[:1].isalpha()) )

[РЕДАКТИРОВАТЬ] если вы должны сделать все это в одной функции, вы можете объединить две (как бы громоздко это ни было):

def split_list(strlist):
    nextFound = split_list(strlist.rest) if strlist.rest else (None,None,None)
    return ( Node(strlist.value,nextFound[0]) if strlist.value[:1].upper() in "AEIOU" else nextFound[0], 
             Node(strlist.value,nextFound[1]) if strlist.value[:1].upper() in "BCDFGHJKLMNPQRSTVXYZ" else nextFound[1], 
             Node(strlist.value,nextFound[2]) if not strlist.value[:1].isalpha() else nextFound[2] )

, если это для домашнее задание, я искренне надеюсь, что ваш учитель будет способствовать разделению интересов и не потребует сомнительных методов кодирования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...