两个文件之间的基数排序的python
Posted
技术标签:
【中文标题】两个文件之间的基数排序的python【英文标题】:radix sort of python between tow files 【发布时间】:2014-04-14 01:51:50 【问题描述】:好的!我刚刚完成了这个程序。它运作良好,但结果不是我想要的。 这是我的全部代码:
#----------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行,这意味着它在排序时以一个数字开始每一新行。
它怎么能像上面那样打印出三行。
【问题讨论】:
【参考方案1】:改变这个:
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
【讨论】:
【参考方案2】:也许写到 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() 可能比编写自己的基数排序更好。这有两个原因:
-
用 Python 编写排序往往比用 C 编写排序要慢,而且 Python 的 list_.sort() 是用 C 编写的。另外,Python 的 list_.sort() 是一个非常好的算法:Timsort。
基数排序有时被称为 O(n),但实际上它是 O(nlogn)。为什么?因为它随着你号码的位数而变化,位数是logn。
【讨论】:
以上是关于两个文件之间的基数排序的python的主要内容,如果未能解决你的问题,请参考以下文章