Базовые алгоритмы обработки вложенных последовательностей
В силу принятого нами подхода работы со списками можно выделить ряд приемов, позволяющих реализовать основные задачи обработки вложенных последовательностей, а именно:
- 1. Нахождение количества элементов вложенной последовательности при заданном условии;
- 2. Нахождение суммы значений элементов вложенной последовательности при заданном условии;
- 3. Нахождение произведения значений элементов вложенной последовательности при заданном условии;
- 4. Поиск экстремальных значений элементов вложенной последовательности (поиск максимального и/или минимального значения);
- 5. Обмен столбцов элементов вложенной последовательности;
- 6. Обмен строк элементов вложенной последовательности;
- 7. Удаление заданной строки вложенной последовательности;
- 8. Замена значений элементов вложенной последовательности.
Ниже описывается реализация перечисленных алгоритмов обработки вложенных последовательностей. Первые четыре способа чрезвычайно просты, данные алгоритмы неоднократно рассматривались при решении задач в предыдущих разделах и в настоящее время не требуют комментариев. Однако стоит отметить, что в первых четырех листингах очередной элемент вложенной последовательности сравнивается с числом 10, однако на практике лучше организовать запрос данных от пользователя.
Нахождение количества элементов вложенной последовательности при заданном условии
Листинг 102
import random
kol=0
n=5
m=5
a = [[i+j for j in random.sample(range(15),5)] for i in ran-dom.sample(range(15),5)]_
for i in range(n): for j in range(m):
print(a[i][j], end-' ")
print()
for i in range(n): for j in range(m): if a[i][j]>=10: kol+= 1
рпп!("пКоличество элементов вложенной последовательности >= 10 равно ", kol)_
Нахождение суммы значений элементов вложенной последовательности при заданном условии
Листинг 103
import random
sum=0
n=5
m=5
a = [[i+j for j in random.sample(range(15),5)] for i in ran-dom.sample(range( 15),5)] for i in range(n): for j in range(m):
print(a[i][j], end-' ") print()
for i in range(n): for j in range(m): ifa[i][j]>=10: sum+=a[i][j]
print(" CyMMa элементов вложенной последовательности >= 10 равно ", sum)_
Нахождение произведения значений элементов вложенной последовательности при заданном условии
Листинг 104
import random
pr=l
n=5
m=5
a = [[i+j for j in random.sample(range(15),5)] for i in ran-
dom.sample(range(15),5)]
for i in range(n):
for j in range(m):
_print(a[i][j], end=" ")_
print()
for i in range(n):
for j in range(m):
if a[i][j]>=10:
pr*=a[i][j]
рпп1("пПроизведение элементов вложенной последовательности >= 10 равно ", рг)_
Нахождение экстремальных значений во вложенной последовательности
Листинг 105
import random
max = -32768 min - 32767 n=5 m=5
a = [[i+j for j in random.sample(range(15),5)] for i in ran-
dom.sample(range(15),5)]
for i in range(n):
for j in range(m):
print(a[i][j], end=" ") print()
for i in range(n):
for j in range(m): if a[i][j]>max: max=a[i][j] if a[i][j] рпп!("пМаксимальный элемент вложенной последовательности = ", max) рпп!("пМинимальный элемент вложенной последовательности - ", min) Обмен столбцов во вложенной последовательности Задача. Во вложенной последовательности произвольных чисел поменяйте местами первый и четвертый столбцы. Выведите обе вложенные последовательности на экран. Комментарий. После генерации элементов вложенной последовательности следует организовать цикл и выполнить в нем три оператора, отвечающих за перестановку столбцов вложенной последовательности: k = a [i] [ 1 ] a[i][l] = a[i][4] a[i][4] = к Поскольку при первом вхождении в цикл параметр цикла i примет значение, равное нулю, во вспомогательную ячейку к отправляется нулевой элемент первого столбца, т. е. элемент, имеющий координаты a0i. На его место приходит элемент с координатами а04- На освободившееся место перейдет элемент, находя щийся в ячейке к. Произошел обмен. Так как все действия осуществляются в цик ле for i in range(n), происходит обмен элементов первого и четвертого столбцов. Разработка алгоритма решения задачи представлена на рис. 121. Рис. 121. Алгоритм решения задачи В листинге 106 приведен код программы, отвечающий за решение задачи. Листинг 106 import random n=5 m=5 a = [[i+j for j in random.sample(range(15),5)] for i in ran-dom.sample(range( 15),5)] for i in range(n): for j in range(m): print(" %3d " a[i][j], end=" ") print() for i in range(n): Юбмен столбцов k=a[i][l] a[i][l]=a[i][4] a[i][4]=k print() for i in range(n): #Вывод результирующей последовательности for j in range(m): printf %3d " a[i][j], end=" ") _printQ_ Результат выполненной программы представлен на рис. 122 Python 3.5.1 Shell File Edit SheN Debug Options Window Help Python 3.5.1 (v3.5.1:37a07cee5969, Dec 62 _ 015, 01:38:48) [MSC v.1900 32 bit (Intel)] on Win32 Type "copyright", "credits" or "license()" for more information. »> RESTART: C: /Users/Cepre?i/AppData/Local/Pro grams/Python/Python35-32/My_Proj ect/Генерац ия 2-ого массива.py 4 7 9 14 6 18 16 10 13 19 7 17 6 13 11 23 12 21 20 16 18 16 23 15 20 4 6 9 14 7 18 19 10 13 16 7 11 6 13 17 23 16 21 20 12 18 20 23 15 16 »> Ln: 16 Col: Рис. 122. Результат работы программы: первый столбец исходной вложенной последовательности поменяли с четвертым столбцом Обмен строк во вложенной последовательности В данной задаче происходит обмен тех строк, номера которых (п_$П и п_$12) задает пользователь. Алгоритмически метод ничем не отличается от рассмотренного выше. При обмене следует воспользоваться третьей ячейкой ЬиГег. В листинге 107 приведен код программы, отвечающий за решение задачи. Листинг 107 import random n=5 m=5 a = [[i+j for j in random.sample(range(15),5)] for i in ran-dom.sample(range( 15),5)] for i in range(n): for j in range(m): print(a[i][j], end-' ") print() п_8и=т!(три1("пВведите номер строки, которая подлежит замене ")) п_812=т!(три1("пВведите номер строки, которую обменяем ")) for j in range(n): bufer=a[n_st2][j] a[n_st2] [j ]=a[n_st 1 ] [j] a[n_stl][j]=bufer print() for i in range(n): for j in range(m): print(a[i][j], end-' ") printQ_ Результат выполненной программы представлен на рис. 123. Рис.123. Результат работы программы: вторую строку исходной вложенной последовательности поменяли с четвертой строкой Удаление заданной строки во вложенной последовательности Удаление заданной строки с номером пэ! происходит с помощью сдвига на один шаг вверх всех последующих строк, начиная с п_8Т+1. Задачу удаления столбца можно решить аналогично. В листинге 108 приведен код программы, отвечающий за решение задачи. Листинг 108 import random n=5 m=5 a= [[i+j for j in random.sample(range(15),5)] for i in ran-dom.sample(range(15),5)] for i in range(n): for j in range(m): print(" %3d " % a[i][j], end=" ") print() n_St=int(input("
BBeflHTe номер строки, которую хотите удалить ")) for i in range(n_st+l,5): for j in range(m): a[i-l]D] = a[i][j] print() for i in range(n-l): for j in range(m): print(" %3d " % a[i][j], end=" ") printQ_ Результат выполненной программы представлен на рис. 124, г- j4' Python 3.5.1 Shell 1° File Edit Shell Debug Options Window Help Python 3.5.1 (v3.5.1:37а07сее5969, Dec б 2015, 01:38 :48) [MSC V.1900 32 bit (Intel)] on Win32 Type "copyright", "credits" or "license()" for more i nformation. »> RESTART: C:/Users/Сергей/AppData/Local/Programs/Pyth on/Python35-32/My Project/Генераиия 2-ого массива.py 16 9 10 12 7 14 10 6 17 11 16 7 5 17 15 13 7 11 10 20 23 28 24 26 14 Звелите номер строки, : которую xo 16 9 10 12 7 14 10 6 17 11 16 7 5 17 15 13 7 11 10 20 »>l Ln: 17 Col: 4 Рис. 124. Удалена четвертая строка исходной матрицы Замена значений элементов вложенной последовательности Задача. Все элементы исходной вложенной последовательности замените нулем, а каждый элемент главной диагонали замените его номером. Вполне логично первоначально осуществить проверку условия: «Находится ли элемент вложенной последовательности на главной диагонали?», т. е. if i==j, а затем выполнить прямое присваивание a[i||j|=i (где i - номер элемента на главной диагонали) или оператор a[i][j]=0, который заменит элементы исходной вложенной последовательности нулем. В листинге 109 приведен код программы, отвечающий за решение задачи. Листинг 109 import random n=5 m=5 a= [[i+j for j in random.sample(range(15),5)] for i in ran- dom.sample(range(15),5)] for i in range(n): for j in range(m): print(" %3d " % a[i][j], end=" ") print() for i in range(n): for j in range(n): if i==j: #Проверка: находится элемент па главной диагонали # или нет? а[ВДИ else: a[i][j]=0 #Замена остальных элементов последовательности #на нуль print() for i in range(n): for j in range(m): print(" %3d " % a[i][j], end=" ") printQ_ Результат выполненной программы представлен на рис. 125. jfy Python 3.5.1 Shell File Edit SheN Debug Options Window Help - I Python 3.5.1 (v3.5.1:37aQ7cee5969, Dec 6 2015, 01:33:48) [MSC v.1900 32 bit (Intel) ] on Win32 Type "copyright", "credits” or "license()" for more information. »> RESTART: C:/Users/Cepre&/AppData/Local/Pr ograir.s/Python/Python35-32/My Project/TeHep гм я 2-ого массива •РУ 14 10 9 12 6 14 7 5 1 6 13 15 11 9 4 12 18 10 17 22 11 16 13 19 17 0 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 4 »>l Ln: 16 Col: 4 Рис. 125. Все элементы вложенной последовательности заменены нулями, элементы главной диагонали - порядковыми номерами