使用heapq模块,Heaps不能在Python中使用字符串列表

时间:2014-06-04 00:24:53

标签: python heapsort

当我遇到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

1 个答案:

答案 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