3

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

4 回答 4

7

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

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

会成功的。键函数通常应该返回一个整数。

于 2013-01-30T20:36:43.110 回答
1

输出到后不能排序stdout。好吧,您不应该这样做,因为它使一项简单的任务变得非常复杂。相反,您对进行排序并打印结果:

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

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

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

于 2013-01-30T20:32:07.673 回答
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]
)
于 2013-01-30T20:32:44.417 回答
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)
于 2013-01-30T21:43:08.063 回答