Задачи по массивам питон

Двумерные массивы

Часто в задачах приходится хранить прямоугольные таблицы с данными. Такие таблицы называются матрицами или двумерными массивами. В языке программирования Питон таблицу можно представить в виде списка строк, каждый элемент которого является в свою очередь списком, например, чисел. Например, создать числовую таблицу из двух строк и трех столбцов можно так:

Здесь первая строка списка 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 .

Для обработки и вывода списка как правило используется два вложенных цикла. Первый цикл по номеру строки, второй цикл по элементам внутри строки. Например, вывести двумерный числовой список на экран построчно, разделяя числа пробелами внутри одной строки, можно так:

for i in range(len(A)): for j in range(len(A[i]): print(A[i][j], end = ' ') print()

То же самое, но циклы не по индексу, а по значениям списка:

for row in A: for elem in row: print(elem, end = ' ') print()

Естественно для вывода одной строки можно воспользоваться методом join :

for row in A: print(' '.join(list(map(str, row))))

Используем два вложенных цикла для подсчета суммы всех чисел в списке:

S = 0 for i in range(len(A)): for j in range(len(A[i])): S += A[i][j]

Или то же самое с циклом не по индексу, а по значениям строк:

S = 0 for row in A: for elem in row: S += elem

Создание списка

Пусть даны два числа: количество строк n и количество столбцов m . Необходимо создать список размером n × m , заполненный нулями.

Читайте также:  Php position in file

Очевидное решение оказывается неверным:

В этом легко убедиться, если присвоить элементу A[0][0] значение 1 , а потом вывести значение другого элемента A[1][0] — оно тоже будет равно 1! Дело в том, что [0] * m возвращает ccылку на список из m нулей. Но последующее повторение этого элемента создает список из n элементов, которые являются ссылкой на один и тот же список (точно так же, как выполнение операции B = A для списков не создает новый список), поэтому все строки результирующего списка на самом деле являются одной и той же строкой.

Таким образом, двумерный список нельзя создавать при помощи операции повторения одной строки. Что же делать?

Первый способ: сначала создадим список из n элементов (для начала просто из n нулей). Затем сделаем каждый элемент списка ссылкой на другой одномерный список из m элементов:

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

Другой (но похожий) способ: создать пустой список, потом n раз добавить в него новый элемент, являющийся списком-строкой:

A = [] for i in range(n): A.append([0] * m)

Ввод списка

Пусть программа получает на вход двумерный массив, в виде n строк, каждая из которых содержит m чисел, разделенных пробелами. Как их считать? Например, так:

A = [] for i in range(n): A.append(list(map(int, input().split())))

Или, без использования сложных вложенных вызовов функций:

A = [] for i in range(n): row = input().split() for i in range(len(row)): row[i] = int(row[i]) A.append(row)

Сложный пример обработки массива

Пусть дан квадратный массив из n строк и n столбцов. Необходимо элементам, находящимся на главной диагонали, проходящей из левого верхнего угла в правый нижний (то есть тем элементам A[i][j] , для которых i==j ) присвоить значение 1 , элементам, находящимся выше главной диагонали – значение 0, элементам, находящимся ниже главной диагонали – значение 2. То есть получить такой массив (пример для n==4 ):

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

Рассмотрим несколько способов решения этой задачи. Элементы, которые лежат выше главной диагонали – это элементы A[i][j] , для которых ij . Таким образом, мы можем сравнивать значения i и j и по ним определять значение A[i][j] . Получаем следующий алгоритм:

for i in range(n): for j in range(n): if i < j: A[i][j] = 0 elif i >j: A[i][j] = 2 else: A[i][j] = 1

Данный алгоритм плох, поскольку выполняет одну или две инструкции if для обработки каждого элемента. Если мы усложним алгоритм, то мы сможем обойтись вообще без условных инструкций.

Сначала заполним главную диагональ, для чего нам понадобится один цикл:

Затем заполним значением 0 все элементы выше главной диагонали, для чего нам понадобится в каждой из строк с номером i присвоить значение элементам A[i][j] для j = i+1 , . n-1 . Здесь нам понадобятся вложенные циклы:

for i in range(n): for j in range(i + 1, n): A[i][j] = 0

Аналогично присваиваем значение 2 элементам A[i][j] для j = 0 , . i-1 :

for i in range(n): for j in range(0, i): A[i][j] = 2

Можно также внешние циклы объединить в один и получить еще одно, более компактное решение:

for i in range(n): for j in range(0, i): A[i][j] = 2 A[i][i] = 1 for j in range(i + 1, n): A[i][j] = 0

А вот такое решение использует операцию повторения списков для построения очередной строки списка. i -я строка списка состоит из i чисел 2 , затем идет одно число 1 , затем идет n-i-1 число 0 :

for i in range(n): A[i] = [2] * i + [1] + [0] * (n - i - 1)

Упражнения

A: Максимум

Найдите индексы первого вхождения максимального элемента. Выведите два числа: номер строки и номер столбца, в которых стоит наибольший элемент в двумерном массиве. Если таких элементов несколько, то выводится тот, у которого меньше номер строки, а если номера строк равны то тот, у которого меньше номер столбца.

Источник

Python: Array Упражнения, Практика, Решение

Модуль массива Python определяет тип объекта, который может компактно представлять массив базовых значений: символы, целые числа, числа с плавающей запятой. Массивы являются типами последовательностей и ведут себя очень похоже на списки, за исключением того, что тип хранимых в них объектов ограничен.

1. Напишите программу на Python для создания массива из 5 целых чисел и отображения элементов массива. Доступ к отдельному элементу через индексы. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

2. Напишите программу на Python для добавления нового элемента в конец массива. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

3. Напишите программу на Python, чтобы изменить порядок элементов в массиве. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

4. Напишите программу на Python, чтобы получить длину в байтах одного элемента массива во внутреннем представлении. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

5. Напишите программу на Python, чтобы получить текущий адрес памяти и длину в элементах буфера, используемых для хранения содержимого массива, а также найти размер буфера памяти в байтах. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

6. Напишите программу на Python, чтобы получить количество вхождений указанного элемента в массиве. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

7. Напишите программу на Python для добавления элементов из inerrable в конец массива. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

8. Напишите программу на Python для преобразования массива в массив машинных значений и возврата байтового представления. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

9. Напишите программу на Python для добавления элементов из указанного списка. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

10. Напишите программу на Python для вставки нового элемента перед вторым элементом в существующем массиве. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

11. Напишите программу на Python для удаления указанного элемента, используя индекс из массива. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

12. Напишите программу на Python, чтобы удалить первое вхождение указанного элемента из массива. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

13. Напишите программу на Python для преобразования массива в обычный список с теми же элементами. Перейти к редактору
Нажмите меня, чтобы увидеть образец решения

Редактор кода Python:

Не отправляйте решение вышеупомянутых упражнений здесь, если вы хотите внести вклад, перейдите на соответствующую страницу упражнения.

Источник

[ Сборник задач ]Тема 4. Работа со списками

Несколько слов о том, что из себя представляют списки в Python, и какие операции можно с ними выполнять.

One

Список – последовательность элементов, объединенных в один контейнер. Главная особенность – они изменяемы.

Элементы списка индексируются, состоят в основном из однотипных данных, перебираются, сохраняют порядок.

Для решения заданий необходимо повторить свойства и методы списков.

Читайте также

Разбираем типы данных в Python: списки, кортежи, словари, множества и т. д. Рассматриваем часто используемые способы ввода-вывода данных. Решаем задачи.

Two

1. Перечислите характеристики типа данных «список», которые вы знаете.

Свойств много. Озвучим некоторые:
1. Списки изменяются динамически (вы можете создать пустой список, потом добавить в него ряд элементов, затем удалить часть из них – и все это будет осуществляться в одном контейнере, относиться к одной и той же переменной);
2. К элементам списка можно получить доступ по индексу (начиная с нулевого). Индексация бывает и обратной, отрицательной (индекс -1 обозначает последний элемент списка, -2 – предпоследний и т.д.);
3. В списках может содержаться ряд элементов любых типов (числа, строки, другие списки …);
4. У списков имеется большое разнообразие методов, позволяющих осуществлять операции с ними (расширять, удалять элементы, очищать, сортировать);
5. Списки можно «резать», т.е. формировать более мелкие последовательности на основании имеющейся;
6. Значения элементов могут повторяться.

2. Как проверить наличие элемента в списке?

1. При помощи конструкции in:

Пример – IDE
lst = [1, 2, 3, 14, 33, 1, 1]
if 1 in lst:
____print(‘Есть’)

Результат:
Есть

2. При помощи метода count:

Пример – IDE
lst = [1, 2, 3, 14, 33, 1, 1]
if lst.count(5):
____print(‘Есть’)
else:
____print(‘Нет’)

Результат:
Нет

3. Чем отличаются методы append() и extend()?

Метод append() добавляет в конец текущего списка новый элемент.
Метод extend() добавляет в конец текущего списка новые элементы в распакованном виде.
Посмотрим отличия на примере.

Пример – IDE
lst = [1, 2, 3, 14, 33, 1, 1]
lst.extend(‘Добавка’)
print(lst)

Результат:
[1, 2, 3, 14, 33, 1, 1, ‘Д’, ‘о’, ‘б’, ‘а’, ‘в’, ‘к’, ‘а’]

Пример – IDE
lst = [1, 2, 3, 14, 33, 1, 1]
lst.append(‘Добавка’)
print(lst)

Результат:
[1, 2, 3, 14, 33, 1, 1, ‘Добавка’]

4. Какие параметры можно передавать при срезах списков?

Для срезов можно пользоваться функцией slice() или специальным сокращением, куда входит 3 параметра: начало среза (по умолчанию – первый элемент), конец среза (конечный член списка, не включая его), шаг (по умолчанию – 1, т.е. выбираем все элементы без пропусков).

Пример – IDE
h = [1, 2, 3, 14, 33, 1, 9]
print(h[slice(2, 6, 2)])

Результат:
[3, 33]

Т.е. создаем новый список начиная с элемента с индексом 2 (в нашем случае это цифра 3) вплоть до 6 элемента (не включая его) с шагом 2 (пропускаем каждое второе значение).
Часть или все параметры можно опускать в специальных сокращениях.

Пример – IDE
h = [1, 2, 3, 14, 33, 1, 9]
print(h[2:6:2])
print(h[::2])

Результат:
[3, 33]
[1, 3, 33, 9]

5*. Что произойдет со списком lst1 в первом и втором случаях? Поясните результат.

Случай 1 – IDE
lst1 = [1, 2, 3, 14, 33, 1, 9]
lst2 = [1, 2, 3, 14, 33, 1, 9]
lst2.append(789)

Случай 2 – IDE
lst1 = [1, 2, 3, 14, 33, 1, 9]
lst2 = lst1
lst2.append(789)

В первом случае список lst1 не изменится, во втором – в нем появится новый элемент 789.

Первый пример показывает создание двух разных списков, хоть и являющихся равными. Тем не менее они занимают разные области в памяти. И изменение одного из списков не вызывает аналогичного поведения в другом.

Во втором примере обе переменные ссылаются на один список, поэтому модификация любой из них отразится на другой.

# Тест случая 1
lst1 = [1, 2, 3, 14, 33, 1, 9]
lst2 = [1, 2, 3, 14, 33, 1, 9]
lst2.append(789)
print(lst1, lst2, sep=’\n’)

Результат:
[1, 2, 3, 14, 33, 1, 9]
[1, 2, 3, 14, 33, 1, 9, 789]

# Тест случая 2
lst1 = [1, 2, 3, 14, 33, 1, 9]
lst2 = lst1
lst1.append(789)
print(lst1, lst2, sep=’\n’)

Результат:
[1, 2, 3, 14, 33, 1, 9, 789]
[1, 2, 3, 14, 33, 1, 9, 789]

Источник

Оцените статью