1. 1. ЕНГІЗУ - ШЫҒАРУ
  2. 2. Шартты операторлар
  3. 3. Есептеулер
  4. 4. Цикл for
  5. 5. Мәтіндер
  6. 6. Цикл while
  7. 7. Тізімдер немесе Массивтер
  8. 8. Функция және рекурсия
  9. 9. Екі өлшемді массивтер
    1. 1. Кірістірілген тізімдерді өңдеу және шығару
    2. 2. Кірістірілген тізімдерді жасау
    3. 3. Екі өлшемді массив енгізу
    4. 4. Екі өлшемді массивті өңдеу мысалы
    5. 5. Екі өлшемді массивтердің кірістірілген генераторлары

      Есептер

    1. Максимум
    2. Ақшақар
    3. Шахмат тақтасы
    4. Негізгісіне параллель диагоналдар
    5. Бүйірлік диагональ
    6. Бағандарды өзгерту
  10. 10. Жиындар
  11. 11. Сөздіктер

Екі өлшемді массивтер

1. Кірістірілген тізімдерді өңдеу және шығару

Көбінесе тапсырмалар деректері бар тікбұрышты кестелерді сақтауды талап етеді. Мұндай кестелер матрицалар немесе екі өлшемді массивтер деп аталады. Python бағдарламалау тілінде кестені жолдар тізімі ретінде көрсетуге болады, оның әрбір элементі өз кезегінде тізім, мысалы, сандар. Мысалы, екі жол мен үш бағаннан тұратын сандық кесте құрылатын, оның көмегімен әртүрлі әрекеттер орындалатын программаны берейік.

Мұнда a[0] тізімінің бірінші жолы [1, 2, 3] сандар тізімі болып табылады. Яғни, a[0][0] == 1, мән a[0][1] == 2, a[0][2] == 3,a[1][0] == 4, a[ 1 ][1] == 5, a[1][2] == 6.

Тізімді өңдеу және көрсету үшін, әдетте, екі кірістірілген цикл пайдаланылады. Бірінші цикл жол нөмірі бойынша қайталанады, екінші цикл сызық ішіндегі элементтер арқылы өтеді. Мысалы, сандарды бір жолдағы бос орындармен бөліп, екі өлшемді сандық тізімді жол бойынша көрсету үшін мына әрекетті орындауға болады:

Біз Python тіліндегі for циклінің айнымалысы range() функциясы арқылы жасалған ауқымда ғана емес, сонымен қатар жалпы кез келген тізбектің кез келген элементтерін қайталай алатынын бір рет түсіндіруге тырыстық. Python тіліндегі тізбектер - бұл тізімдер, жолдар және біз әлі кездеспеген басқа да нысандар. Бұл үшін ыңғайлы for циклінің қасиетін пайдаланып екі өлшемді массив шығару жолын көрсетейік:

Әрине, бір жолды шығару үшін join() әдісін қолдануға болады:

Тізімдегі барлық сандардың қосындысын есептеу үшін біз екі кірістірілген циклды қолданамыз:

Немесе индекс бойынша емес, жол мәндері бойынша циклмен бірдей нәрсе:

2. Кірістірілген тізімдерді жасау

Екі сан берілсін: жолдар саны n және бағандар саны m. Нөлдермен толтырылған n×m өлшемдерінің тізімін жасау керек.

Айқын шешім дұрыс емес болып шығады:

a = [[0] * m] * n

Егер сіз a[0][0] элементіне 5 мәнін тағайындасаңыз, содан кейін басқа a[1][0] элементінің мәнін көрсетсеңіз, мұны оңай тексеруге болады - ол да 5-ке тең болады. [0] * m - m нөлдер тізіміне сілтемені қайтарады. Бірақ сол элементтің кейінгі итерациясы сол тізімге сілтеме болып табылатын n элементтердің тізімін жасайды (тізімдердегі b = a жаңа тізім жасамайтыны сияқты), нәтижесінде алынған тізімнің барлық жолдары шын мәнінде бір және бірдей сызық.

Визуализаторда тізімдердің идентификатор нөміріне назар аударыңыз. Егер екі тізімнің идентификаторы бірдей болса, олар шын мәнінде жадтағы бірдей тізім болып табылады.

Сондықтан екі өлшемді тізімді бір жолды қайталау операциясы арқылы жасау мүмкін емес. Енді не істеу керек?

Бірінші әдіс: алдымен n элементтердің тізімін жасаңыз (бастау үшін тек n нөл). Содан кейін тізімнің әрбір элементін m элементтен тұратын басқа бір өлшемді тізімге сілтеме жасаймыз:

Басқа (бірақ ұқсас) әдіс: бос тізім жасаңыз, содан кейін оған жаңа элементті n рет қосыңыз, бұл жолдар тізімі:

Бірақ генераторды пайдалану одан да оңай: n элементтердің тізімін жасаңыз, олардың әрқайсысы m нөлдер тізімі болады:

Бұл жағдайда әрбір элемент басқалардан тәуелсіз құрылады (тізім [0] * m тізімнің келесі элементін толтыру үшін қайта құрастырылады) және сол тізімге сілтемелер көшірілмейді.

3. Екі өлшемді массив енгізу

Бағдарлама кіріс ретінде әрқайсысы бос орындармен бөлінген m саннан тұратын n жол түріндегі екі өлшемді массивді алсын. Оларды қалай санауға болады? Мысалы, келесідей:

Немесе күрделі кірістірілген функция шақыруларын пайдаланбай:

Сіз генераторды пайдаланып бірдей нәрсені жасай аласыз:

4. Екі өлшемді массивті өңдеу мысалы

n жолдан және n бағаннан тұратын шаршы массив берейік. Жоғарғы сол жақтан төменгі оң жақ бұрышқа өтетін негізгі диагональда орналасқан элементтерге 1 мәнін беру керек (яғни, a[i][j] элементтері, олар үшін i==j), және негізгі диагональдың үстінде орналасқан элементтерге 0 мәні, негізгі диагональдан төмен элементтердің мәні 2. Яғни, келесі массивді алу керек (n==4 үшін мысал):

    1 0 0 0
    2 1 0 0
    2 2 1 0
    2 2 2 1
    

Бұл мәселені шешудің бірнеше жолдарын қарастырайық. Негізгі диагоналдың үстінде жатқан элементтер a[i][j] элементтері болып табылады, олар үшін i < j, ал негізгі диагональдан төмен элементтер үшін i>j. Осылайша, біз i және j мәндерін салыстырып, оларды A[i][j] мәнін анықтау үшін пайдалана аламыз. Біз келесі алгоритмді аламыз:

5. Екі өлшемді массивтердің кірістірілген генераторлары

Барлық жолдар үшін генератор ішіндегі жол болып табылатын тізімге генераторды орналастыру арқылы екі өлшемді массивтерді жасау үшін кірістірілген генераторларды пайдалануға болады. Әрбір элементі m нөлдер тізімі болатын n элементтің тізімін жасайтын генераторды пайдаланып n жол мен m бағанның тізімін жасауға болатынын еске түсіріңіз:

[[0] * m for i in range(n)]

Бірақ сонымен бірге ішкі тізімді, мысалы, келесідей генератордың көмегімен де жасауға болады: [0 for j in range(m)]. Бір генераторды екіншісіне салу арқылы біз кірістірілген генераторларды аламыз:

[[0 for j in range(m)] for i in range(n)]

Бірақ егер 0 саны i (жол нөмірі) және j (баған нөмірі) байланысты қандай да бір өрнекпен ауыстырылса, онда сіз қандай да бір формула бойынша толтырылған тізімді ала аласыз.

Мысалы, келесі массивді көрсету керек делік (ыңғайлы болу үшін элементтер арасында қосымша бос орындар қосылады):

    0  0  0  0  0  0
    0  1  2  3  4  5
    0  2  4  6  8 10
    0  3  6  9 12 15
    0	4  8 12 16 20
    

Бұл массивте n = 5 жол, m = 6 баған бар және i жолы мен j бағанындағы элемент мына формула бойынша есептеледі: a[i][j] = i * j.

Мұндай массив жасау үшін генераторды пайдалануға болады:

[[i * j for j in range(m)] for i in range(n)]