Функциональное программирование Python
Условия задания:
"Информация о студентах хранится в .txt файле. Сформировать набор структур для хранения и обработки информации. Вывести студентов, которые имеют более двух задолженностей в порядке уменьшения их задолженностей. В случае равности некоторых из элементов - осуществить вывод студентов с равным кол-вом задолженностей по среднему баллу(От автора вопроса: тут тоже имеется ввиду "вывод от большего к меньшему"). В случае равности баллов - по номеру группы."
Мой код:
# DATA CONSTRUCTIONS ( MUST BE REWORKED )
DataArray = []
DeptsArray = [] # COUNT OF DEPTS FOR EVERY PERSON
NamesArray = [] # PPL NAMES
AVGDeptsScore = [] # AVG SCORE
GroupsNumbers = []
ListOfIndexes = []
outsideCounter = 0
saver = 0
# READ DATA FROM FILE
with open("Data.txt") as file:
DataArray = file.read().splitlines()
# ANONYMOUS FUNCTIONS BLOCK ( MANDATORY REQUIRMENT )
sliceDepts = lambda : list(map(int, DataArray[7::9]))
sliceNames = lambda : list(map(str, DataArray[0::9]))
sliceAVGDepts = lambda : list(map(int, DataArray[8::9]))
sliceGroupNumber = lambda : list(map(int, DataArray[1::9]))
# INFORMATION SLICES
DeptsArray = sliceDepts()
NamesArray = sliceNames()
AVGDeptsScore = sliceAVGDepts()
GroupsNumbers = sliceGroupNumber()
def bubbleSort(number): # RECURSIVE BUBBLE SORT
global outsideCounter
global DeptsArray
if(outsideCounter != len(DeptsArray) - 1):
if(number != len(DeptsArray) - outsideCounter - 1):
if(DeptsArray[number] < DeptsArray[number + 1]):
synchronization(number, number + 1)
_tmp = DeptsArray[number + 1]
DeptsArray[number + 1] = DeptsArray[number]
DeptsArray[number] = _tmp
return bubbleSort(number + 1)
return bubbleSort(number + 1)
outsideCounter += 1
return bubbleSort(0)
def synchronization(bun1, bun2): # bun1, bun2 - local integer positions for lists elements
# NAMES SYNCHRONIZATION
_tmpName = NamesArray[bun2]
NamesArray[bun2] = NamesArray[bun1]
NamesArray[bun1] = _tmpName
# AVG DEPTS SCCORE SYNCHRONIZATION
_tmpAVG = AVGDeptsScore[bun2]
AVGDeptsScore[bun2] = AVGDeptsScore[bun1]
AVGDeptsScore[bun1] = _tmpAVG
def checkDuplicates(cnt): # cnt - local iterator
if(cnt != len(DeptsArray) - 1):
if(DeptsArray[cnt] == DeptsArray[cnt + 1] or DeptsArray[cnt] == DeptsArray[cnt - 1]):
ListOfIndexes.append(cnt)
ListOfIndexes.append(DeptsArray[cnt])
return checkDuplicates(cnt + 1)
if(DeptsArray[cnt] != DeptsArray[cnt + 1] and (DeptsArray[cnt - 1] not in ListOfIndexes) or DeptsArray[cnt] != DeptsArray[cnt + 1] and (DeptsArray[cnt] not in ListOfIndexes)):
if(DeptsArray[cnt] >= 2):
print(str(DeptsArray[cnt]) + " " + NamesArray[cnt] + " " + str(AVGDeptsScore[cnt]))
return checkDuplicates(cnt + 1)
# CODE START
print(DeptsArray) # OUTPUT [2, 4, 2, 2, 1, 0, 1]
bubbleSort(0)
DeptsArray.append(-1) # ADDING LIMITER
checkDuplicates(0)
print(ListOfIndexes)
Вся сложность заключается в том, что это мой первый опыт в "функционалке", если можно сказать так.
Переработанный код для запуска на Вашем компьютере(вырезан файловый ввод, данные готовы сразу):
# DATA CONSTRUCTIONS ( MUST BE REWORKED )
DeptsArray = [2, 4, 2, 2, 1, 0, 1]
NamesArray = ['Petrov Petr Petrov', 'Ivanov Ivan Ivanovich', 'Prokopenko Katerina Sergeevna', 'Slavyanova Slavyana Vyacheslavovna', 'Shymko Dmitriy Igorevich', 'Delf John', 'Sun Ci']
AVGDeptsScore = [19, 30, 50, 50, 45, 0, 59]
GroupsNumbers = [123, 123, 450, 200, 300, 690, 690]
ListOfIndexes = []
outsideCounter = 0
saver = 0
def bubbleSort(number): # RECURSIVE BUBBLE SORT
global outsideCounter
global DeptsArray
if(outsideCounter != len(DeptsArray) - 1):
if(number != len(DeptsArray) - outsideCounter - 1):
if(DeptsArray[number] < DeptsArray[number + 1]):
synchronization(number, number + 1)
_tmp = DeptsArray[number + 1]
DeptsArray[number + 1] = DeptsArray[number]
DeptsArray[number] = _tmp
return bubbleSort(number + 1)
return bubbleSort(number + 1)
outsideCounter += 1
return bubbleSort(0)
def synchronization(bun1, bun2): # bun1, bun2 - local integer positions for lists elements
# NAMES SYNCHRONIZATION
_tmpName = NamesArray[bun2]
NamesArray[bun2] = NamesArray[bun1]
NamesArray[bun1] = _tmpName
# AVG DEPTS SCCORE SYNCHRONIZATION
_tmpAVG = AVGDeptsScore[bun2]
AVGDeptsScore[bun2] = AVGDeptsScore[bun1]
AVGDeptsScore[bun1] = _tmpAVG
def checkDuplicates(cnt): # cnt - local iterator
if(cnt != len(DeptsArray) - 1):
if(DeptsArray[cnt] == DeptsArray[cnt + 1] or DeptsArray[cnt] == DeptsArray[cnt - 1]):
ListOfIndexes.append(cnt)
ListOfIndexes.append(DeptsArray[cnt])
return checkDuplicates(cnt + 1)
if(DeptsArray[cnt] != DeptsArray[cnt + 1] and (DeptsArray[cnt - 1] not in ListOfIndexes) or DeptsArray[cnt] != DeptsArray[cnt + 1] and (DeptsArray[cnt] not in ListOfIndexes)):
if(DeptsArray[cnt] >= 2):
print(str(DeptsArray[cnt]) + " " + NamesArray[cnt] + " " + str(AVGDeptsScore[cnt]))
return checkDuplicates(cnt + 1)
# CODE START
bubbleSort(0)
DeptsArray.append(-1)
Проще говоря, визуальный максимум которого я добился: вывод первого уникального студента с четырьмя задолженностями и отсортированные данные во всех листах.
К сожалению, ума не приложу каким образом осуществить вывод повторяющихся студентов по баллам используя функциональное программирование, потому надеюсь на Вашу помощь.
Если вопрос и не будет закрыт, то попрошу более уважаемых юзеров не удалять его, дабы такие же новички как и я могли забрать из моего кода нужные части, к примеру рекурсивную пузырьковую сортировку или иные фичи :)