用对象和排序填充列表(新手)

时间:2009-12-17 08:50:49

标签: python list sorting object

我是Python的新手,所以请在使用错误的条款时原谅我:)

我想要列出几个“对象”,每个对象都有相同的数字属性(A,B,C)。然后,该列表应按属性A的值进行排序。

在Java中我定义了一个以我的属性为成员的类,实现Sortable来比较A,将它们全部放在某种List中,让Collections.sort对我的列表进行排序。

结果应该“看起来”那样:

A   B   C
1   2   3
1   2   4
2   5   1
3   1   1

在Python中做这样的事情的最佳方法是什么?

5 个答案:

答案 0 :(得分:6)

class myclass(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def __repr__(self):
        return "(a=%s, b=%s, c=%s)" % (self.a, self.b, self.c)

>>> obj1 = myclass(1, 2, 3)
>>> obj2 = myclass(1, 2, 4)
>>> obj3 = myclass(2, 5, 1)
>>> obj4 = myclass(3, 1, 1)

>>> print sorted([obj1, obj2, obj3, obj4], key=lambda o: o.a)
[(a=1, b=2, c=3), (a=1, b=2, c=4), (a=2, b=5, c=1), (a=3, b=1, c=1)]

答案 1 :(得分:4)

抱歉,如果我的问题出错了。我不是很清楚。

所以,我假设你想要按列排序

假设x是二维数组

>>> x=[[1, 2, 3], [1, 2, 4], [2, 5, 1], [3, 1, 1]]
>>> x
[[1, 2, 3], [1, 2, 4], [2, 5, 1], [3, 1, 1]]

这是使用itemgetter

对每列进行排序的一种方法
from operator import itemgetter

>>> sorted(x,key=itemgetter(0))
[[1, 2, 4], [1, 2, 3], [2, 5, 1], [3, 1, 1]]
>>> sorted(x,key=itemgetter(1))
[[3, 1, 1], [1, 2, 4], [1, 2, 3], [2, 5, 1]]
>>> sorted(x,key=itemgetter(2))
[[3, 1, 1], [2, 5, 1], [1, 2, 3], [1, 2, 4]]

如果您想进行就地排序,请点击x.sort(key=itemgetter(0))

答案 2 :(得分:3)

考虑使用namedtuple来创建对象。 (看看is-there-a-tuple-data-structure-in-python。)

  

collections.namedtuple(typename, field_names[, verbose])

     

返回名为typename的新元组子类。新子类用于创建类似元组的对象,这些对象具有可通过属性查找访问的字段以及可索引和可​​迭代的字段。子类的实例还有一个有用的docstring(带有typename和field_names)和一个有用的 repr ()方法,它以name = value格式列出元组内容。

包含A B C字段名称的简单交互式会话。排序很简单 key=lambda o:o.A

>>> import collections
>>> mob=collections.namedtuple('myobj',('A','B','C'))
>>> mlist = [mob(3,1,1), mob(1,2,3), mob(1,2,4), mob(2,5,1)]
>>> mlist
[myobj(A=3, B=1, C=1), myobj(A=1, B=2, C=3), myobj(A=1, B=2, C=4), myobj(A=2, B=5, C=1)]
>>> for x in sorted(mlist,key=lambda o:o.A):
...     print x
...     
myobj(A=1, B=2, C=3)
myobj(A=1, B=2, C=4)
myobj(A=2, B=5, C=1)
myobj(A=3, B=1, C=1)
>>> 

答案 3 :(得分:2)

List = [(3,1,1),(1,2,4),(2,5,1),(1,2,3)]
sorted(List)

更新:答案的核心实际上是sorted内置的。我只是将它放在两行上以允许增量检查:(a)选择的数据结构是元组列表,(b)排序由sorted完成。正如一位评论者所指出的,sorted()将在一个中按A排序,然后是B,然后是C(无论这是否是必需的)。其他答案为将sort-picking函数添加到sorted()的调用中提供了一个很好的观点,以确定将在比较中使用哪个元素。同样,这是否有利于OP判断。我想提供一个最小的解决方案。

Update1:​​我拖拽了列表中的元素,所以它对排序更有吸引力:)。

答案 4 :(得分:2)

您可以将比较函数作为列表sort的第一个参数。请参阅下面的代码:

class Foo:
    def __init__(self, a, b=0, c=0):
        self.a = a
        self.b = b
        self.c = c

    def __repr__(self):
        return "%d %d  %d" % (self.a, self.b, self.c)


foos = [Foo(2, 5, 1), Foo(1, 2, 4), Foo(3, 1, 1), Foo(1, 2, 3)]

def cmp_a(f1, f2): 
    if f1.a == f2.a:
        return 0
    elif f1.a < f2.a:
        return -1
    else:
        return 1

foos.sort(cmp_a)

for f in foos:
    print f