我是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中做这样的事情的最佳方法是什么?
答案 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