radix типа python между двумя файлами

Хорошо здесь! я только что закончил эту программу. это работает хорошо, но результат не то, что я хотел. вот весь мой код:

#----------class of queue----------
class queue:
    def __init__(self):
        self._queue = []

    def __str__(self):
        sstr = ""
        for i in self._queue:
            sstr += str(i)
            sstr += ", "
        return sstr

    def __len__(self):
        return len(self._queue)

    def after(self):
        return self._queue.pop(0)

    def add(self, i):
        self._queue.append(i)

#----------radix sort----------
def set_output():
    output_list = []
    for i in range (10):
        output_list.append(queue())
    return output_list

def set_radix(lists):
    output_list = set_output()
    for number in lists:
        a = number[2]
        output_list[int(a)].add(number)
    return output_list

def sec_radix(input_list, i):
    output_list = set_output()
    for queue in input_list:
        while len(queue) > 0:
            num = queue.after()
            a = num[i]
            output_list[int(a)].add(num)
    return output_list

def done_radix(num_list):
    return sec_radix(sec_radix(set_radix(num_list), 1), 0)

#----------read and write file----------        
def readfile(infile):
    print "Reading files, please wait..."
    f = open(infile, "r")
    lineList = f.readlines()
    f.close()
    outputList = []
    for line in lineList:
        line = line.strip()
        outputList.append(line.split(" "))
        print "Reading finished!"
    return outputList

def writefile(outfile, nums):
    print "Writing files, please wait..."
    output = new_output(nums)
    f = open(outfile, "w")
    f.write(output)
    print "Writing finished!"

def new_output(three_list):
    output = ""
    for queue_list in three_list:
        for numqueue in queue_list:
            while len(numqueue) > 0:
                output += numqueue.after()
                output += " "
                output += "\n"
    return output

#----------main function----------
def main():
    infile = readfile("radix.in")
    final_list = []
    for num_list in infile:
        print "Sorting..."
        final_list.append(done_radix(num_list))
    print "Sorting finished!"
    writefile("radix.out", final_list)

main()

вот какой ввод и вывод должны быть три строки:

для radix.in:

1 строка: 467 119 635 231 234 858 2 строка: 786 463 715 745 729 574 856 806 339 106 487 3 строка: 798 791 392 916 177 115 948 871 525

для radix.out:

1 строка: 119 231 234 467 635 858 2 строка: 106 339 463 487 574 715 729 745 786 806 856 3 строка: 115 177 392 525 791 798 871 916 948

когда вы запускаете эту программу, вам нужно иметь два файла по одному пути (одна и та же папка). когда вы закончите работу, результат должен выглядеть так, как показано выше, который является radix.out, который действительно подключен... он должен просто создать три строки, но есть 26 строк, что означает, что каждая новая строка начинается с одного числа при сортировке.

как он может просто распечатать три строки, как указано выше.


person BengDai    schedule 14.04.2014    source источник


Ответы (2)


Измените это:

def new_output(three_list):
    output = ""
    for queue_list in three_list:
        for numqueue in queue_list:
            while len(numqueue) > 0:
                output += numqueue.after()
                output += " "
                output += "\n"
    return output

К этому (обратите внимание на отступ в предпоследней строке!):

def new_output(three_list):
    output = ""
    for queue_list in three_list:
        for numqueue in queue_list:
            while len(numqueue) > 0:
                output += numqueue.after()
                output += " "
        output += "\n"
    return output
person asamarin    schedule 14.04.2014

Возможно, напишите в outfile что-то вроде:

with open('radix.out', 'w') as outfile:
    for sublist in final_list:
        list1 = (str(element).strip() for element in sublist)
        list2 = (element for element in list1 if element)
        list3 = (element.rstrip(',') for element in list2)
        string = ', '.join(list3)
        outfile.write('{}\n'.format(string))

Кстати, вам, вероятно, лучше использовать list_.sort(), чем писать свою собственную сортировку по основанию. Это по двум причинам:

  1. Написание сортировки на Python, как правило, медленнее, чем сортировка на C, а list_.sort() в Python написан на C. Кроме того, list_.sort() в Python — это очень хороший алгоритм: Timsort.
  2. Иногда говорят, что сортировка по основанию O(n), но на самом деле это O(nlogn). Почему? Потому что оно зависит от количества цифр в ваших числах, а количество цифр — logn.
person dstromberg    schedule 14.04.2014