如何排序对象属性

时间:2012-02-25 20:48:42

标签: python oop sorting

我的对象大致如此:

class Hand(object):
    def __init__(self, finger_names, finger_lengths, nail_sizes):
        self.finger_names = finger_names
        self.finger_lengths = finger_lengths
        self.nail_sizes = nail_sizes

   def _sort_by_finger_lengths(self):
        ????

finger_namesfinger_lengthsnail_sizes都是同等长的列表或为空(例如,如果此人尚未衡量他们的nail_sizes)。目标是通过finger_lengths对对象的属性进行排序。因此,如果您从一个Hand对象开始,其中列表按从左到右的名称(小指,圆环,中间,指针,拇指)排序,您最终会得到一个Hand对象,其中所有属性都按finger_lengths排序。

像这样:

finger_names = [pinky, thumb, pointer, ring, middle]
finger_lengths = [6, 7, 12, 13, 15]
nail_sizes = []

编辑添加:手只是一个示例类。真正的代码有充分的理由为每个属性提供列表。

3 个答案:

答案 0 :(得分:3)

任何人都可以告诉你如何做到这一点,但它似乎很脆弱。为什么不做一个Finger课程并为自己节省一些理智呢?

class Finger(object):
  PINKY = 0
  RING = 1
  MIDDLE = 2
  INDEX = 3
  THUMB = 4

  def __init__ (self, type):
    self.type = type
    self.length = None
    self.nail_size = None

  def __lt__ (self, other):
    return self.length < other.length

f = Finger(Finger.PINKY)
f.length = 6

这很容易在任何一个方向排序,你不必担心哪些手指报告了长度的错位,哪些没有。

答案 1 :(得分:0)

一种简单的方法是:

>>> finger_names, finger_lengths
(('pointer', 'ring', 'pinky', 'middle', 'thumb'), (12, 13, 6, 15, 7))
>>> s_tuples = sorted(zip(finger_names, finger_lengths), key=lambda x: x[1])
>>> finger_names, finger_lengths = zip(*s_tuples)
>>> finger_names, finger_lengths
(('pinky', 'thumb', 'pointer', 'ring', 'middle'), (6, 7, 12, 13, 15))

但是,Nick是正确的,您应该将它们链接到数据结构中,而不是依赖于它们关联它们的顺序。

上述策略(使用key)在这种情况下仍然有效,但您无需使用zip(*s_tuples)取消关联它们。

另一方面,如果你想要取消它们,那么我就会忘记一个单线解决方案。

finger_lengths, finger_names = zip(*sorted(zip(finger_lengths, finger_names)))

或者,如果要进行排序,请保存一个复制操作:

s_tuples = zip(finger_lengths, finger_names)
s_tuples.sort()
finger_lengths, finger_names = zip(*temp)

答案 2 :(得分:0)

您可以使用包含所有三个属性的元组的单个列表,以便在排序期间将它们保持在一起。使用现有数据结构对排序代码执行此操作的一种简单方法是使用zip来组合和解压缩它们

l = zip(finger_lengths, finger_names, nail_sizes)
l.sort()
finger_lengths, finger_names, nail_sizes = zip(*l)

如果你的指甲大小是空的,那么这不起作用,所以即使没有任何东西,你应该用零填充它,如nail_sizes = [0] * 5。如果你想将数据结构保持为单独的列表,我建议这样做。否则,如果你不介意重新组织它以使其更加面向对象,那么最好像尼克所说并做一个手指课一样。