seregazolotaryow64
@seregazolotaryow64
IT Специалист и самоучка

Почему как в Javascript и PHP нельзя создавать ассоциативные ключи?

Добрый день!

Некоторый функционал Python может быть похож на функционал PHP и JavaScript, если взять к примеру - создание ассоциативных ключей?

Сам пример кода:
#Работа с данными для их анализа
ds = DatasetRead()
rdata = ReportDataRead()
rwb = ReportDataWorkBook()
rd = rwb.get_sheet_by_name('Report')

#Массивы для проверки соответствии при анализе
mlsb = LearnLevelBalanceArray()
msd = maxSalaryDataArray()
sgl = {}


for index, row in ds.iterrows():
    #Производит выборку данных из датасета. Это - первый этап анализа данных по студентам с опытом работы.

    #Если решение на русском языке, то расшифровка пола выпускника переводится на английский язык.
    if row['gender'] == "M": 
        gender = "Муж"
    if row['gender'] == "F": 
        gender = "Жен"

    sgl['profile']['gender'] = gender
    sgl['profile']['education_work'] = {
        'degree': row['degree_t'],
        'specialisation': row['specialisation'],
        'salary': row['salary']
    }
    

    

    if row['workex'] == "Yes":

        mls_scc = LearnMaxLevelDataArray("school")

        for rowm, index in mls_scc.itterows():

            if rowm['gender'] == "M": 
                input_ssc_level = rd[rowm[1][0][index]].value
            if rowm['gender'] == "F": 
                input_ssc_level = rd[rowm[0][0][index]].value

            maxlevelbalance = 100 - input_ssc_level #Получает баланс уровня от максимального уровня критерии
            userlevelbalance = 100 - row['ssc_p']

            if maxlevelbalance > userlevelbalance:
                    levelbalance = maxlevelbalance - userlevelbalance #Подсчитываем баланс от уровня

            if maxlevelbalance < userlevelbalance:
                levelbalance = userlevelbalance - maxlevelbalance

            for rowms, index in mlsb.iterrows():
                if levelbalance == rowms[index] or levelbalance > rowms[index]:

                    #Если текущий баланс уровня соответствует нужным критериям, то система для списка успешных выпускников оставит уровень школьных знании, которого добился выпускник
                    sgl['profile']['info']['school'] = row['ssc_p']

        mls_hsc = LearnMaxLevelDataArray("high")

        for rowm, index in mls_hsc.itterows():

            if rowm['gender'] == "M": 
                input_ssc_level = rd[rowm[1][0][index]].value
            if rowm['gender'] == "F": 
                input_ssc_level = rd[rowm[0][0][index]].value

            maxlevelbalance = 100 - input_ssc_level #Получает баланс уровня от максимального уровня критерии
            userlevelbalance = 100 - row['hsc_p']

            if maxlevelbalance > userlevelbalance:
                    levelbalance = maxlevelbalance - userlevelbalance #Подсчитываем баланс от уровня

            if maxlevelbalance < userlevelbalance:
                levelbalance = userlevelbalance - maxlevelbalance

            for rowms, index in mlsb.iterrows():
                if levelbalance == rowms[index] or levelbalance > rowms[index]:

                    #Если текущий баланс уровня соответствует нужным критериям, то система для списка успешных выпускников оставит уровень знании в ВУЗах, которого добился выпускник
                    sgl['profile']['info']['highschool'] = row['hsc_p']

        mls_mba = LearnMaxLevelDataArray("mba")

        for rowm, index in mls_mba.itterows():

            if row['gender'] == "M": 
                input_ssc_level = rd[rowm[1][0][index]].value
            if row['gender'] == "F": 
                input_ssc_level = rd[rowm[0][0][index]].value

            maxlevelbalance = 100 - input_ssc_level #Получает баланс уровня от максимального уровня критерии
            userlevelbalance = 100 - row['mba_p']

            if maxlevelbalance > userlevelbalance:
                    levelbalance = maxlevelbalance - userlevelbalance #Подсчитываем баланс от уровня

            if maxlevelbalance < userlevelbalance:
                levelbalance = userlevelbalance - maxlevelbalance

            for rowms, index in mlsb.iterrows():
                if levelbalance == rowms[index] or levelbalance > rowms[index]:

                    #Если текущий баланс уровня соответствует нужным критериям, то система для списка успешных выпускников оставит уровень знании в ВУЗах, которого добился выпускник
                    sgl['profile']['info']['highschool'] = row['mba_p']


        mls_estet = LearnMaxLevelDataArray("estet")

        for rowm, index in mls_estet.itterows():

            if row['gender'] == "M": 
                input_ssc_level = rd[rowm[1][0][index]].value
            if row['gender'] == "F": 
                input_ssc_level = rd[rowm[0][0][index]].value

            maxlevelbalance = 100 - input_ssc_level #Получает баланс уровня от максимального уровня критерии
            userlevelbalance = 100 - row['estet_p']

            if maxlevelbalance > userlevelbalance:
                    levelbalance = maxlevelbalance - userlevelbalance #Подсчитываем баланс от уровня

            if maxlevelbalance < userlevelbalance:
                levelbalance = userlevelbalance - maxlevelbalance

            for rowms, index in mlsb.iterrows():
                if levelbalance == rowms[index] or levelbalance > rowms[index]:

                    #Если текущий баланс уровня соответствует нужным критериям, то система для списка успешных выпускников оставит уровень знании в ВУЗах, которого добился выпускник
                    sgl['profile']['info']['estet'] = row['estet_p']

        mls_degree = LearnMaxLevelDataArray("degree")

        for rowm, index in mls_degree.itterows():

            if row['gender'] == "M": 
                input_ssc_level = rd[rowm[1][0][index]].value
            if row['gender'] == "F": 
                input_ssc_level = rd[rowm[0][0][index]].value

            maxlevelbalance = 100 - input_ssc_level #Получает баланс уровня от максимального уровня критерии
            userlevelbalance = 100 - row['degree_p']

            if maxlevelbalance > userlevelbalance:
                    levelbalance = maxlevelbalance - userlevelbalance #Подсчитываем баланс от уровня

            if maxlevelbalance < userlevelbalance:
                levelbalance = userlevelbalance - maxlevelbalance

            for rowms, index in mlsb.iterrows():
                if levelbalance == rowms[index] or levelbalance > rowms[index]:

                    #Если текущий баланс уровня соответствует нужным критериям, то система для списка успешных выпускников оставит уровень знании в ВУЗах, которого добился выпускник
                    sgl['profile']['info']['degree'] = row['degree_p']

print(sgl)


Если вы видите sgl - это переменная, отвечающая за реализацию ассоциативных ключей. В плане массивов Python имеется некая схожесть с массивами в PHP и JS. Но я новичок в Python и столкнулся с этой проблемой от компилятора:
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
 in 
     20         gender = "Жен"
     21 
---> 22     sgl['profile']['gender'] = gender
     23     sgl['profile']['education_work'] = {
     24         'degree': row['degree_t'],

KeyError: 'profile'

Он требует, чтобы правильно был реализован ключ массива. Следуя по этому материалу, думал, что хорошо заработает и стало всё по-другому.
Подскажите, как в Python правильно реализовать ассоциативные массивы, чтобы программа могла хорошо заработать?
Заранее вам спасибо!
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
Tomio
@Tomio
backend developer (python, php)
Python "на лету" не умеет создавать ключи словарей (асс. массивов).
Вот это работать не будет, если у словаря sql нет всех вложенных ключей.
sgl['profile']['info']['degree'] = row['degree_p']

Чтобы всё работало, убедитесь, что ключи в словаре присутствуют. Если их нет, то инициируйте их.
if 'profile' not in sql:
    sql.update({'profile': {}})
if 'info' not in sql['profile']:
    sql['profile'].update({'info': {}})
if 'degree' not in sql['profile']['info']:
    sql['profile']['info'].update({'degree': {}})


И тогда вот это будет работать:
sgl['profile']['info']['degree'] = row['degree_p']
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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