【发布时间】:2014-02-13 09:27:06
【问题描述】:
我必须将冒泡排序作为家庭作业,我的 python 脚本必须查找 2 个命令行参数:
-f 指定输入文件的文件路径,每行包含一个数字,我必须使用冒泡排序进行排序;
-p 如果指定,则告诉脚本在命令行中打印排序后的数字列表。
另外,我必须实现算法原位,这意味着我必须只使用一个列表/数组/等,而无需分配任何其他临时列表/数组/等或变量来保存一个或算法中要排序的所有数字的一部分。因此,在我的脚本中,我只使用 unsortedList 来保存要排序的数字。我从以下链接中获取了冒泡排序算法:Bubble Sort Homework。
这是我的脚本:
import sys, getopt
def main(argv):
inputFilePath = ""
printList = False
# Traitement pour parser les arguments
try:
opts, args = getopt.getopt(argv, "f:p")
except getopt.GetoptError:
usage()
sys.exit()
for opt, arg in opts:
if opt in ("-f"):
inputFilePath = arg
if opt in ("-p"):
printList = True
inputFile = open(inputFilePath, "r")
unsortedList = [line.rstrip('\n') for line in inputFile]
sortedList = bubble(unsortedList)
if printList == True:
print (sortedList)
def usage():
print ("""
Usage: bubble.py -f <filepath> -p
-f <filepath> [REQUIRED]: specifies the filepath of the input file
-p [OPTIONAL]: specifies whether to print the sorted list or not
""")
# Function found at https://stackoverflow.com/questions/895371/bubble-sort-homework
def bubble(unsortedList):
length = len(unsortedList) - 1
isSorted = False
while not isSorted:
isSorted = True
for i in range(length):
if unsortedList[i] > unsortedList[i+1]:
isSorted = False
unsortedList[i], unsortedList[i+1] = unsortedList[i+1], unsortedList[i]
return unsortedList
if __name__ == "__main__":
main(sys.argv[1:])
我的脚本有 2 个问题:
首先,如果我不指定 -f 参数,脚本永远不会运行 usage() 函数,它只会告诉“没有这样的文件或目录:''”。为什么我的脚本没有运行 usage() 函数?
此外,冒泡排序算法似乎无法正常工作。如果我运行脚本,数字排序不正确。例如,我可以在列表中看到 403 之前的 3998。但是,我注意到这些数字是排序的,但只是从数字的左边开始。比如我可以看到2553,256,2562。256显然不大于2553,但是如果你从左边数取,左边第三个字符6,比2553左边第三个字符大,即 5。
我该如何解决这两个问题?
感谢您的帮助。
【问题讨论】:
-
首先,您使用
getopt有什么原因吗? The docs 明确表示,“不熟悉 Cgetopt()函数或希望编写更少代码并获得更好帮助和错误消息的用户应考虑改用argparse模块。”你显然不是 Cgetopt的老手,那么你为什么要在 Python 中使用这个神秘的 C 风格模块而不是它推荐的模块呢? -
第二,不要将两个完全独立的问题放在一个问题中。挑一个然后问这个。或者,更好的是,只需发布两个单独的问题。 (您可以在它们两者之间添加链接,以使它们明显是相同的代码。)您将获得更好的答案,并且启动次数增加一倍。
-
最后,请尽量减少您发布到 Minimal, Complete, Valid Example 的内容,其中包含足够的代码来显示您想要解决的问题,而不是您的整个程序。
-
我使用 getOpt 的原因是因为这是我在网上看到的内容。我是 Python 新手,我认为这是我必须用来检查参数和标志的东西。感谢您将 argparse 模块指向我,我会看看。
-
一般来说,每当您使用 Python 标准库模块时,至少浏览一下文档。他们通常有很好的简短解释或很好的例子——这也是你在使用有更好替代品的东西时发现的方法。
标签: python algorithm sorting bubble-sort