logo

Python | Правильне використання двовимірних масивів/списків

Python надає потужні структури даних, які називаються списками, які можуть зберігати колекції елементів і керувати ними. Також надає багато способів створення двовимірних списків/масивів. Однак потрібно знати відмінності між цими способами, оскільки вони можуть створити ускладнення в коді, які може бути дуже важко відстежити. У цій статті ми розглянемо правильний спосіб використання 2D-масивів/списків у Python.

Правильне використання двовимірних масивів/списків

Правильне використання двовимірних масивів/списків передбачає розуміння структури, доступ до елементів і ефективне маніпулювання даними у двовимірній сітці. Під час роботи зі структурованими даними або сітками можуть бути корисними двовимірні масиви або списки. Двовимірний масив – це, по суті, список списків, який представляє табличну структуру з рядками та стовпцями.



Створення 1-D списку

У Python ініціалізація набору елементів у лінійній послідовності вимагає створення одновимірного масиву, що є фундаментальним процесом. Хоча Python не має вбудованої структури даних під назвою «1D масив», ми можемо використовувати список, який може досягти тієї ж функціональності. Списки Python є динамічними та універсальними, що робить їх чудовим вибором для представлення одновимірних масивів. Давайте почнемо з розгляду поширених способів створення одномірного масиву розміром N, ініціалізованого нулями.

Створення одновимірного списку за допомогою наївних методів

Ініціалізація та заповнення списку вручну без використання будь-яких розширених функцій або конструкцій у Python відоме як створення одновимірного списку за допомогою наївних методів.

Python3








N>=> 5> ar>=> [>0>]>*>N> print>(ar)>

>

>

Вихід

[0, 0, 0, 0, 0]>

Створення одновимірного списку за допомогою List Comprehension

Тут ми множимо кількість рядків на порожній список, і, отже, весь список створюється з нулем кожного елемента.

нормалізація в базі даних

Python3




N>=> 5> arr>=> [>0> for> i>in> range>(N)]> print>(arr)>

>

>

Вихід

[0, 0, 0, 0, 0]>

Створення 2-D списку

Правильне використання двовимірних масивів/списків передбачає розуміння структури, доступ до елементів і ефективне маніпулювання даними у двовимірній сітці. Освоївши використання 2D-масивів, ви можете значно покращити свою здатність обробляти складні дані та ефективно виконувати різні операції.

Створення двовимірного списку за допомогою Наївний метод

Тут ми множимо кількість стовпців і, отже, отримуємо одновимірний список розміром, що дорівнює кількості стовпців, а потім множимо його на кількість рядків, що призводить до створення двовимірного списку.

завантажити youtube за допомогою vlc

Python3




rows, cols>=> (>5>,>5>)> arr>=> [[>0>]>*>cols]>*>rows> print>(arr)>

>

>

Вихід

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Примітка: Використання цього методу іноді може призвести до неочікуваної поведінки. У цьому методі кожен рядок посилатиметься на один стовпець. Це означає, що навіть якщо ми оновимо лише один елемент масиву, він оновить той самий стовпець у нашому масиві.

Python




rows, cols>=> (>5>,>5>)> arr>=> [[>0>]>*>cols]>*>rows> print>(arr,>'before'>)> arr[>0>][>0>]>=> 1> # update only one element> print>(arr,>'after'>)>

>

>

Вихід

([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]], 'before') ([[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]], 'after')>

Створення одновимірного списку за допомогою Розуміння списку

Тут ми в основному використовуємо концепцію розуміння списку та застосовуємо цикл для списку всередині списку, а отже створюємо 2-D список.

Python3




двійковий в bcd
rows, cols>=> (>5>,>5>)> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> print>(arr)>

>

>

Вихід

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Створення одновимірного списку за допомогою Порожній список

Тут ми додаємо нулі як елементи для певної кількості стовпців, а потім додаємо цей одновимірний список до списку порожніх рядків і, таким чином, створюємо двовимірний список.

Python3




arr>=>[]> rows, cols>=>5>,>5> for> i>in> range>(rows):> >col>=> []> >for> j>in> range>(cols):> >col.append(>0>)> >arr.append(col)> print>(arr)>

>

>

Вихід

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Ініціалізація 2D масиву

Наданий код демонструє два різні підходи до ініціалізації 2D-масиву Python . По-перше, масивarr>ініціалізується за допомогою двовимірного розуміння списку, де кожен рядок створюється як[0, 0, 0, 0, 0]>. Весь масив створюється як список посилань на той самий внутрішній список, що призводить до псевдонімів. Будь-яка зміна, внесена до елемента в одному рядку, буде відображена в усіх рядках. Потім у коді показано інший підхід із використанням розуміння вкладеного списку для створення 2D-масивуarr>. Цей метод дозволяє уникнути псевдонімів, створюючи новий список для кожного рядка, у результаті чого створюється правильний 2D-масив.

дискретне математичне заперечення

Python3




# Python 3 program to demonstrate working> # of method 1 and method 2.> rows, cols>=> (>5>,>5>)> # method 2 1st approach> arr>=> [[>0>]>*>cols]>*>rows> # lets change the first element of the> # first row to 1 and print the array> arr[>0>][>0>]>=> 1> for> row>in> arr:> >print>(row)> # method 2 2nd approach> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> # again in this new array lets change> # the first element of the first row> # to 1 and print the array> arr[>0>][>0>]>=> 1> for> row>in> arr:> >print>(row)>

>

>

Вихід

[1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [0, 0, 0, 0, 0] [0, 0, 0, 0, 0] [0, 0, 0, 0, 0] [0, 0, 0, 0, 0]>

Пояснення:

Ми очікуємо, що лише перший елемент першого рядка зміниться на 1, але перший елемент кожного рядка буде змінено на 1 у методі 2a. Це незвичайне функціонування пояснюється тим, що Python використовує неглибокі списки, які ми спробуємо зрозуміти.
У методі 1a Python не створює 5 цілих об’єктів, а створює лише один цілочисельний об’єкт, і всі індекси масиву arr вказують на той самий об’єкт int, як показано.

Якщо ми присвоїмо 0-й індекс іншому цілому числу, скажімо 1, тоді буде створено новий цілочисельний об’єкт зі значенням 1, а потім 0-й індекс тепер вказує на цей новий об’єкт int, як показано нижче

Подібним чином, коли ми створюємо 2d-масив як arr = [[0]*cols]*rows, ми по суті розширюємо наведену вище аналогію.

  1. Створюється лише один цілочисельний об’єкт.
  2. Створюється єдиний список 1d, і всі його індекси вказують на той самий об’єкт int у точці 1.
  3. Тепер arr[0], arr[1], arr[2] …. arr[n-1] усі вказують на той самий об’єкт списку вище в пункті 2.

Наведене вище налаштування можна візуалізувати на зображенні нижче.

Тепер давайте змінимо перший елемент у першому рядку arr як arr[0][0] = 1

  • arr[0] вказує на єдиний об’єкт списку, який ми створили вище. (Пам’ятайте, arr[1], arr[2] …arr[n-1] також вказують на той самий об’єкт списку).
  • Присвоєння arr[0][0] створить новий об’єкт int зі значенням 1, і arr[0][0] тепер вказуватиме на цей новий об’єкт int. (так само arr[1][0], arr [2][0] … обр[n-1][0])

Це добре видно на зображенні нижче.

Отже, коли двовимірні масиви створюються таким чином, зміна значень у певному рядку вплине на всі рядки, оскільки, по суті, існує лише один цілочисельний об’єкт і лише один об’єкт списку, на який посилаються всі рядки масиву.

Як і слід було очікувати, відстежити помилки, викликані таким використанням неглибоких списків, важко. Отже, кращий спосіб оголосити 2d-масив

Python3




rows, cols>=> (>5>,>5>)> print>([[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)])>

>

>

Вихід

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Цей метод створює 5 окремих об’єктів списку, на відміну від методу 2a. Одним із способів перевірити це є використання оператора «is», який перевіряє, чи два операнди посилаються на той самий об’єкт.

розбиття рядка c++

Python3




rows, cols>=> (>5>,>5>)> # method 2 2nd approach> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> # check if arr[0] and arr[1] refer to> # the same object> print>(arr[>0>]>is> arr[>1>])># prints False> # method 2 1st approach> arr>=> [[>0>]>*>cols]>*>rows> # check if arr[0] and arr[1] refer to the same object prints True because there is only one> #list object being created.> print>(arr[>0>]>is> arr[>1>])>

>

>

Вихід

False True>