现在我想做下降排序,不使用任何排序命令参数。所以我想一种方法,让每个值乘以-1,最大值就是最小值,最小值就是最大值。然后因为排序comand是按第一个值排序的,如果不加任何comand参数。所以我打印格式值,让每个值都有相同的位。这种方法将用于map reduce。Map程序代码:
import sys
import re
for line in sys.stdin:
adver_num=0
line=line.strip()
words=line.split('\t')
adver_num= (-1)*(int(words[0]))
print"%09.0f\t%s\t%s"%(adver_num,words[1],words[2])
然后cat a.log | python mapper.py | sort>b.log。而b.log,似乎负数仍然不起作用。
b.log中的最后一行显示如下。似乎sort命令没有考虑负数。如何修复它?
-00026844
-00027621
-00029789
-00029848
-00030789
-00032120
-00034452
-00034458
-00037064
-00038644
2条答案
按热度按时间0wi1tuuw1#
你可以用
sorted(iterable, cmp=None, key=None, reverse=False)
功能。您可以在此处找到详细信息:http://docs.python.org/2/library/functions.html#sortedy53ybaqx2#
sort
如果没有选项,将按词汇排序,所以-2
在之前-3
只是因为它们被当作字符串,而不是数字。使用sort -n
或者继续读下去。如果有一个上限值(第一列可以取的最大值),那么可以从中减去。为了避免额外的计算,您可以将其添加为前缀,然后在排序后将其剥离(另请参见schwartzian变换)。
假设最大值不能超过10000000。然后你可以把它规定为理论上的最大值
排序后可以去掉第一列。
如果您对将整个数据集读入内存感到满意(如@viktorkerkez的回答),那么您只需要获得最大可用值,并可以将其用作上限值。这有一个明显的缺点,即您不能处理不适合内存的数据集(而且由于交换,不适合物理内存的数据集处理起来会非常慢)。