当我遇到heapq
模块时,我正在阅读python 2.7文档。我对heapify()和heappop()方法感兴趣。所以,我决定为整数编写一个简单的heapsort程序:
from heapq import heapify, heappop
user_input = raw_input("Enter numbers to be sorted: ")
data = map (int, user_input.split(","))
new_data = []
for i in range(len(data)):
heapify(data)
new_data.append(heappop(data))
print new_data
这就像一个魅力。
为了让它更有趣,我想我会取消整数转换并将其保留为字符串。从逻辑上讲,它应该没有区别,代码应该像整数一样工作:
from heapq import heapify, heappop
user_input = raw_input("Enter numbers to be sorted: ")
data = user_input.split(",")
new_data = []
for i in range(len(data)):
heapify(data)
print data
new_data.append(heappop(data))
print new_data
注意:我在for循环中添加了一个print语句以查看堆积列表。
这是我运行脚本时的输出:
`$ python heapsort.py
Enter numbers to be sorted: 4, 3, 1, 9, 6, 2
[' 1', ' 3', ' 2', ' 9', ' 6', '4']
[' 2', ' 3', '4', ' 9', ' 6']
[' 3', ' 6', '4', ' 9']
[' 6', ' 9', '4']
[' 9', '4']
['4']
[' 1', ' 2', ' 3', ' 6', ' 9', '4']`
我应用的推理是,由于字符串正在进行比较,如果树是数字,树应该是相同的。很明显,在第三次迭代之后,heapify没有正常工作。有人可以帮我弄清楚我在这里遗失了什么吗?我在RedHat 3.4.6-9上运行Python 2.4.5。
谢谢, VSN
答案 0 :(得分:2)
你应该strip
这些空格。他们是这种奇怪排序的原因。字符串的排序是用ASCII码逐个字符完成的。
所以试试:
from heapq import heapify, heappop
user_input = raw_input("Enter numbers to be sorted: ")
data = user_input.split(",")
data = map(str.strip, data)
new_data = []
heapify(data)
for i in range(len(data)):
print(data)
new_data.append(heappop(data))
print(new_data)
这个问题比排序heapq
更重要。在这种情况下排序本身只是关于<
和<=
的工作方式。
排序数字直观,但字符串不同。通常,字符串由它们使用的位模式按字符排序。这是以下行为的原因
>>> sorted("abcABC")
['A', 'B', 'C', 'a', 'b', 'c']
A
的ASCII代码为65,而a
的ASCII代码为97(请参阅ASCII Table)。
排序是逐个字符完成的。如果字符串a
是另一个字符串b
的前缀,则始终为a < b
。
>>> sorted(["123", "1", "2", "3", "12", "15", "20"])
['1', '12', '123', '15', '2', '20', '3']
您想要的是“自然分类”。请参阅natsort
。