Listy w liście zmieniają położenie za każdym uruchomieniem funkcji.

0

Cześć,

Mam ciężki problem.
Walczę z programem do odmiany czasowników, ale mam taki problem, że mam listę list, i za każdym razem, gdy odpalę moją funkcję
listy zmieniają położenie, a muszą mieć zawsze ten sam index, żeby działało, to co wykombinowałem.

Mój kod (nie bijcie):

Głowny moduł:

from pt_conjugator import enum_verbs_conjugator
from pt_conjugator import irregular_verbs_patterns
from pt_conjugator.enum_verbs_conjugator import TenseEndings


class NotInfinitiveError(ValueError):
    pass


def main(word):
    """
    This method check whether input is a string and a verb

    :param word:
    :return:
    """

    try:
        # word = input('Enter a verb to be conjugated\n').lower()
        word = 'achar'
        if not word.isalpha():
            raise TypeError('A entrada incorreta | An incorrect input')

        if not word.endswith(('ar', 'er', 'ir')):
            raise NotInfinitiveError('A palavra inserida não é infinitivo | Not an infinitive')

    except NotInfinitiveError as nie:
        print(nie)
        return
    except TypeError as t_err:
        print(t_err)
        return

    def conjugate_change_last_two_letters(word, endings=enum_verbs_conjugator.TenseEndings.AR_ENDINGS.value):

        combined_persons_with_conjugated_forms = []
        conjugated_forms = []
        for tens, terminations in endings.items():
            for e in terminations:
                conjugated_forms.append(word[:-2] + e)
                lists_of_conjugated_verbs = [conjugated_forms[i:i + 5] for i in range(0, len(conjugated_forms), 5)]

        print(lists_of_conjugated_verbs)

    def conjugate_ar_ended_verb(word):
        endings = enum_verbs_conjugator.TenseEndings.AR_ENDINGS.value
        conjugate_change_last_two_letters(word, endings)

    print(conjugate_ar_ended_verb(word))


if __name__ == '__main__':
    main('achar')
    # input('Enter a verb to be conjugated\n').lower()

Enum:

from enum import Enum


# This module is a collection of all names of grammatical persons and tense endings.

class GrammaticalPersons(Enum):
    PERSONS = ('Eu/I', 'Tu/You', 'Ele/Ela/você/He/She/It', 'Nós/We', "Else/Elas/vocês/They")


class TenseEndings(Enum):
    AR_ENDINGS = {'INDICATIVO PRESENTE': ('o', 'as', 'a', 'amos', 'am'),
                  'PRETERITO_PERFEITO_INDICATIVO': ('ei', 'aste', 'ou', 'amos', 'aram'),
                  'PRETERITO_IMPERFEITO_INDICATIVO': ('ava', 'avas', 'ava', 'ávamos', 'avam'),
                  'PRETERITO_MAIS_QUE_PERFEITO': ('ara', 'aras', 'ara', 'áramos', 'aram'),
                  }

    ENDINGS_ER = {'INDICATIVO_PRESENTE': ('o', 'es', 'e', 'emos', 'em'),
                  'PRETERITO_PERFEITO_INDICATIVO': ('i', 'este', 'eu', 'emos', 'eram'),
                  'PRETERITO_IMPERFEITO_INDICATIVO': ('ia', 'ias', 'ia', 'íamos', 'iam'),
                  'PRETERITO_MAIS_QUE_PERFEITO': ('era', 'eras', 'era', 'êramos', 'eram'),
                  }

    ENDINGS_IR = {'INDICATIVO_PRESENTE': ('o', 'es', 'e', 'imos', 'em'),
                  'PRETERITO_PERFEITO_INDICATIVO': ('i', 'iste', 'iu', 'imos', 'iram'),
                  'PRETERITO_IMPERFEITO_INDICATIVO': ('ia', 'ias', 'ia', 'íamos', 'iam'),
                  'PRETERITO_MAIS_QUE_PERFEITO': ('ira', 'iras', 'ira', 'íramos', 'iram'),
                  }

    CONDICIONAL_AND_FUTURO_ENDINGS_COMMON_FOR_EVERY_ENDING = {
        'FUTURO_SIMPLES_INDICATIVO': ('ei', 'ás', 'á', 'emos', 'ão'),
        'CONDICIONAL_SIMPLES': ('ia', 'ias', 'ia', 'íamos', 'iam')}

Chcę dostawać za każdym razem taki wynik:

[['acho', 'achas', 'acha', 'achamos', 'acham'], ['achava', 'achavas', 'achava', 'achávamos', 'achavam'], ['achara', 'acharas', 'achara', 'acháramos', 'acharam'], ['achei', 'achaste', 'achou', 'achamos', 'acharam']]

Ale zawsze kolejność list wewnątrz jest inna.
Macie jakieś podpowiedzi, czy cała logika jest do kosza?

1

Bo to u Ciebie, to nie lista, tylko słownik. A w słowniku kolejność jest obojętna, więc za każdym razem może być (i często jest) inna. Jak upierasz się przy swoim sposobie, to użyj listy par zamiast słownika. I w razie potrzeby tylko konwertuj go na słownik przez dict.

1

Wydaje mi się, że prez to, że w pythonie dict nie jest uporządkowany (a za każdym razem Tworzysz nowy obiekt). Nie Używasz za bardzo kluczy tego słownika, Spróbuj w klasie TensEndings przechowywać te końcówki w zwykłej liście.

AR_ENDINGS = [['o', 'as', 'a', 'amos', 'am'],
                  ['ei', 'aste', 'ou', 'amos', 'aram'],
                  ['ava', 'avas', 'ava', 'ávamos', 'avam'],
                ['ara', 'aras', 'ara', 'áramos', 'aram'],
                  ]
0

Bo to u Ciebie, to nie lista, tylko słownik. A w słowniku kolejność jest obojętna
w pythonie dict nie jest uporządkowany (a za każdym razem Tworzysz nowy obiekt)

Dzięki, to wszystko wyjaśnia, już mi się plącze to, od patrzenia się na to, za duży bałagan mam dalej w kodzie.
Uczę się od niedawna w sumie i nie wiem, jak to uporządkować najlepiej.

Jak upierasz się przy swoim sposobie
Nie, nie jestem nastawiony do tego w ten sposób, na razie szukam najlepszego rozwiązania, eksperymentuję, żeby się nie powtarzać, itd.
Co byś sugerował zamiast tego?

Nie Używasz za bardzo kluczy tego słownika, Spróbuj w klasie TensEndings przechowywać te końcówki w zwykłej liście.

Dzięki za podpowiedź. Masz rację, nie warto robić z tego słownika, skoro tak rzadko pojawiają się klucze.

Dzięki za odpowiedzi i pozdro.

1

Albo jeśli musisz już mieć słownik i to posortowany to użyj collections.OrderedDict()

0

Albo jeśli musisz już mieć słownik i to posortowany to użyj collections.OrderedDict()

Dzięki za podpowiedź, zapomniałem o tym rodzaju słownika.
Sprawdzę wszystkie sposoby i podejmę jakąś decyzję.
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1