Python的类列表,index()不起作用

时间:2018-10-15 08:13:33

标签: python

不知道我在做什么错。我上了这个课:

class Node:
    '''
    Class to contain the lspid seq and all data.
    '''
    def __init__(self, name,pseudonode,fragment,seq_no,data):
        self.name = name
        self.data = {}
        self.pseudonode = pseudonode
        self.seq_no = seq_no
        self.fragment = fragment
    def __unicode__(self):
        full_name = ('%s-%d-%d') %(self.name,self.pseudonode,self.fragment)
        return str(full_name)
    def __cmp__(self, other):
        if self.name > other.name:
            return 1
        elif self.name < other.name:
            return -1
        return 0
    def __repr__(self):
        full_name = ('%s-%d-%d') %(self.name,self.pseudonode,self.fragment)
        #print 'iside Node full_name: {} \n\n\n ------'.format(full_name)
        return str(full_name)

并将一些条目放入列表中:

nodes = []
node = Node('0000.0000.0001',0,0,100,{})
nodes.append(node)
>>> nodes
[0000.0000.0001-0-0]
node = Node('0000.0000.0001',1,0,100,{})
nodes.append(node)
>>> nodes
[0000.0000.0001-0-0, 0000.0000.0001-1-0]

我正在尝试获取列表节点中节点的索引[]

>>> node
0000.0000.0001-1-0
>>> nodes.index(node) 
0

0不是我期望的。不知道为什么会这样。

编辑 我在获得列表的索引后,即“ 0000.0000.0001-1-0”所在的位置。

1 个答案:

答案 0 :(得分:3)

index函数在容器上使用时,依赖于其元素的__cmp__函数返回它认为与输入对象相等的第一个元素的索引。您可能知道很多,因为您为节点实现了它。但是您期望的是__cmp__不仅考虑名称,还考虑伪节点和片段,对吗?

一种直接的方法是将它们视为一个元组,该元组从左到右执行元素比较,直到找到第一个不等式:

def __cmp__(self, other):
    self_tuple = (self.name, self.pseudonode, self.fragment)
    other_tuple = (other.name, other.pseudonode, other.fragment)
    if self_tuple > other_tuple:
        return 1
    elif self_tuple < other_tuple:
        return -1
    return 0

如果需要其他顺序,则可以使用元组顺序来定义它。