我的对象大致如此:
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_names
,finger_lengths
和nail_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 = []
编辑添加:手只是一个示例类。真正的代码有充分的理由为每个属性提供列表。
答案 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
。如果你想将数据结构保持为单独的列表,我建议这样做。否则,如果你不介意重新组织它以使其更加面向对象,那么最好像尼克所说并做一个手指课一样。