Базовые алгоритмы обработки вложенных последовательностей

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

  • 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

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. Все элементы вложенной последовательности заменены нулями, элементы главной диагонали - порядковыми номерами

 
< Пред   СОДЕРЖАНИЕ     След >