你如何排序python命令的输出?

时间:2013-01-30 20:28:57

标签: python sorting sorted

Python初学者。假设我的脚本末尾有一些东西从系统中查询信息并将其转储为这种格式:

print my_list_of_food(blah)

并输出如下列表:

('Apples', 4, 4792320)
('Oranges', 2, 2777088)
('Pickles', 3, 4485120)
('Pumpkins', 1, 5074944)
('more stuff', 4545, 345345)

如何根据第二个字段对输出进行排序,使其看起来像这样:

('Pumpkins', 1, 5074944)
('Oranges', 2, 2777088)
('Pickles', 3, 4485120)
('Apples', 4, 4792320)

除了将bash命令导入cut -d "," -f 2 | head 4之外,我宁愿使用python。我知道我可以使用sorted或sort来对现有的元组或字典进行排序,但我不确定如何对打印输出进行排序。我做了一些研究,一切都指向在我的脚本中实现排序而不是排序打印输出,但谁知道,也许有人有解决方案。感谢。

更新:

谢谢大家。我试图让所有解决方案都有效,但我一直收到这个错误:

File "test.py", line 18, in <lambda>
    print sorted(my_list_of_food(blah), key=lambda x: x[1])
TypeError: 'int' object is unsubscriptable

File "test.py", line 18, in <lambda>
    print(sorted(my_list_of_food(blah), key=lambda k: k[1]))
TypeError: 'int' object is unsubscriptable

我尝试在脚本开头包含这个:

from __future__ import print_function 

但没有运气。

4 个答案:

答案 0 :(得分:5)

您可以使用键参数进行排序。在你的情况下,

print(sorted(list_of_food, key=lambda k:k[1]))

会做到这一点。键函数通常应该返回一个整数。

答案 1 :(得分:1)

如果以这种方式打印,则my_list_of_food(blah)返回一个字符串,或者它返回一个具有__repr__方法的类实例,该方法返回该字符串...最好的办法是获取数据在它成为字符串之前以实际列表格式。

如果它返回一个类实例,获取列表并使用键对其进行排序...否则你需要解析文本,所以我只会解决那个部分:

# this is assuming the structure is consistent
# function to parse a line of the form "('{text}', {int}, {int})" into tuple members using regex
import re
re_line = re.compile(r"\('(?P<name>\w*)',\s?(?P<int1>\d+)\s?,\s?(?P<int2>\d+)\)")
def ParseLine(line):
    m = re_line.match(line)
    if m:
        return (m.group('name'), int(m.group('int1')), int(m.group('int2')))
    # otherwise return a tuple of None objects
    else:
        return (None, None, None)

# final sorted output (as tuples of (str, int, int) )
sorted( 
    [ParseLine(line) for line in my_list_of_food(blah).splitlines()],
    key = lambda tup: tup[1]
)

答案 2 :(得分:0)

输出到stdout后无法排序。嗯,你不应该,因为它使一个简单的任务变得非常复杂。而是将排序并打印结果:

print sorted(my_list_of_food(blah), key=lambda x: x[1])

你遇到困难的部分是按第二个字段排序;这就是key参数存在的原因 - 覆盖默认排序(这将是元组的第一项)。要了解有关关键功能的更多信息,请查看this section on the python Sorting HOW TO

如果您仍然想知道,从技术上讲,如果您用缓冲输出的包装器对象替换stdout,那么可以sys.stdout输出进行排序,然后对其进行排序和打印(对于真正的标准输出)定期,但这是毫无意义的,很难做到,恕我直言。

答案 3 :(得分:0)

好的:如果你真的必须这样做:捕获函数的输出 一个StringIO对象,并对从该对象读回的行进行排序。

import sys
try:
    from StringIO import StringIO
except:
    from io import StringIO

a = [ ('Apples', 4, 4792320), 
    ('Oranges', 2, 2777088), 
    ('Pickles', 3, 4485120), 
    ('Pumpkins', 1, 5074944), 
    ('more stuff', 4545, 345345) ]

[步骤1]

out = StringIO()    # create a StringIO object
sys.stdout = out    # and redirect stdout to it
for item in a : print (item)        # print output
sys.stdout = sys.__stdout__     # redirect stdout back to normal stdout

out.seek(0)     # rewind StringIO object
s = out.readlines() # and read the lines.

[步骤2:定义一个键函数,用逗号分隔字符串,

并以数字方式比较第二个字段。 ]

def sortkey(a):
   return int(a.split(',')[1].strip())

[第3步:排序和打印]

s.sort(key=sortkey)
for line in s: print (line)