获取最近附加项目的索引

时间:2011-07-01 08:25:53

标签: python list

是否有一种简单的方法来获取我刚刚附加到列表中的项目的索引?我需要跟踪最后添加的项目。

我提出了两种可能的解决方案:

# Workaround 1
# The last added is the one at index len(li) - 1
>> li = ['a', 'b', 'c',]
>> li.append('d')
>> last_index = len(li) - 1
>> last_item = li[len(li) - 1]

# Workaround 2
# Use of insert at index 0 so I know index of last added
>> li = ['a', 'b', 'c',]
>> li.insert(0, 'd')
>> last_item = li[0]

是否有获取附加项索引的技巧?

如果没有,您会使用以上哪个以及为什么?你建议的任何不同的解决方法?

3 个答案:

答案 0 :(得分:17)

li[-1]是列表中的最后一项,因此是最近附加到其末尾的项目:

>>> li = [1, 2, 3]
>>> li.append(4)
>>> li[-1]
4

如果您需要索引而不是项目,那么len(li) - 1就可以了,并且非常有效(因为len(li)是在恒定时间内计算的 - 见下文)


在CPython的源代码中,列表len映射到list_length中的函数Objects/listobject.c

static Py_ssize_t
list_length(PyListObject *a)
{
    return Py_SIZE(a);
}

Py_SIZE只是一个用于访问Include/object.h中定义的所有Python对象的size属性的宏:

#define Py_SIZE(ob)     (((PyVarObject*)(ob))->ob_size)

因此,len(lst)本质上是一个单指针解除引用。

答案 1 :(得分:3)

您可以从任意一侧索引列表。最后一个元素的索引始终为-1,您不需要调用len。在开头重复插入效率非常低(要求列表中的所有元素都向下移动一个位置)。

答案 2 :(得分:3)

第三种可能的解决方案是子类list并覆盖append方法,以便在您调用它时自动存储在mylist.last_added之类的属性中。

这种方法 - 如果扩展到其他列表方法 - 提供的优势是,您可以创建一个类,它将跟踪最后添加的元素的索引,无论使用何种方法({ {1}},insert或简单分配append)。

在list对象中嵌入此信息的另一个好处是,您可以传递它而不必担心命名空间(因此,即使您的列表由mylist[some_index] = some_value或{传递,您也可以检索它例如{1}}。