Алгоритм сортировки справки в питоне - PullRequest
0 голосов
/ 27 июня 2018

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

Итак, я сохранил каждую строку файла как элемент в списке. Я создаю еще одну функцию, которая разбивает каждый элемент на 2d массив, где я могу легко получить доступ к именным переменным. Оттуда я хочу создать вложенный цикл for, который во время итерации проверяет самое высокое значение в массиве, удаляет значение из списка и добавляет его в новый список, пока не будет отсортированный список.

Я думаю, что я нахожусь на 90% пути, но у меня возникают проблемы, когда я обдумываю логику алгоритмов сортировки. Кажется, что проблема становится все более сложной, и я продолжаю хотеть использовать указатели. Если бы кто-то мог помочь пролить свет на эту тему, я был бы очень признателен.

import os
from http.cookiejar import DAYS
from macpath import split

# This program reads a given input file and finds its longest line.
class Employee: 
    def __init__(self, EmployeeID, name, wage, days):
        self.EmployeeID = EmployeeID
        self.name = name
        self.wage = wage
        self.days = days

def Extraction(file,file2):
    employList = [] 
    while True:
        line1 = file.readline().strip()
        line2 = file2.readline().strip()
        #print(type(line1))
        employList.append(line1)
        #print(line1)
        employList.append(line2)
        #print(line2)
        if line1 == '' or line2 == '':
            break
    return employList

def Sort(mylist):
    splitlist = []
    sortedlist = []
    print(len(mylist))
    for items in range(len(mylist)):

        #print(mylist[items].split())
        splitlist.append(mylist[items].split())
        print(splitlist)
    #print(splitlist[1][1])
    #print(splitlist[1][2])
    highest = "z"
    print(highest)
    sortingLength = len(splitlist)
    for i in range(10):
        for items in range(len(splitlist)-2):
            if highest > splitlist[items][2]:
                istrue = highest < splitlist[items][2]
                highest = splitlist[items][1]
                print(items)
                print(istrue)
                print('marker')
                print(splitlist[items][2])
            if items == (len(splitlist)-2):
                print("End of list",splitlist[items][2])

        print(highest)
        print(splitlist.index(highest))
    print(splitlist[len(splitlist)-1][2])
    print(sortingLength)

fPath = 'C:/Temp'

fileName = 'payroll1.txt'
fullFileName = os.path.join(fPath,fileName)
fileName2 = 'payroll2.txt'
fullFileName2 = os.path.join(fPath,fileName2)

f = open(fullFileName,'r')
f2 = open(fullFileName2, 'r')

employeeList = Extraction(f,f2)#pulling out each line in the file and placing into a list
Sort(employeeList)

ReportName= "List of Employees:"
marker = '-'* len(ReportName)
print (ReportName + ' \n' + marker)
total = 0

f.close()

У меня возникли проблемы с тем, что когда-то я получил самое высокое значение, пытаясь добавить это значение в отсортированный список, удаляя значение из splitlist и повторно запуская код.

1 Ответ

0 голосов
/ 27 июня 2018

Использование метода sorted намного проще и уже встроено, согласно предложению Джорана. Я отредактировал ваш метод чтения так, чтобы он строил два списка кортежей, представляющих строку и длину строки. Сортированный метод вернет список, отсортированный по ключу (длина строки) и по убыванию (reverse=True)

from operator import itemgetter

class Employee: 
    def __init__(self, EmployeeID, name, wage, days):
        self.EmployeeID = EmployeeID
        self.name = name
        self.wage = wage
        self.days = days

def Extraction(file,file2):
    employList = [] 
    mylines = [(i, len(l.strip()), 'file1') for i,l in enumerate(file.readlines())]
    mylines2 = [(i, len(l.strip()), 'file2') for i,l in enumerate(file2.readlines())]

    employList = [*mylines, *mylines2]

    return employList

fPath = 'C:/Temp'

fileName = 'payroll1.txt'
fullFileName = os.path.join(fPath,fileName)
fileName2 = 'payroll2.txt'
fullFileName2 = os.path.join(fPath,fileName2)

f = open(fullFileName,'r')
f2 = open(fullFileName2, 'r')

employeeList = Extraction(f,f2)#pulling out each line in the file and placing the line_number and length into a list

f.close()
f2.close()

# Itemgetter will sort on the second element of the tuple, len(line)
# and reverse will put it in descending order
ReportName = sorted(employeeList, key=itemgetter(1), reverse=True)

РЕДАКТИРОВАТЬ: я добавил маркеры в кортежи, чтобы вы могли отслеживать, какие строки пришли из какого файла. Может быть немного запутанным без них

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...