获取最近添加项的索引

21 投票
3 回答
19895 浏览
提问于 2025-04-16 20:38

有没有简单的方法可以找到我刚刚添加到列表中的一个项目的索引?我需要记住最后添加的那个项目。

我想到了两种可能的解决办法:

# 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 个回答

3

你可以从列表的两边来访问元素。最后一个元素的索引总是-1,你不需要使用len来计算。不断在列表的开头插入元素效率很低,因为这会导致列表中的所有元素都要往后移动一个位置。

4

第三种可能的解决方案是创建一个新的类,继承自 list,并重写 append 方法。这样,每当你调用这个方法时,它会自动把你添加的最后一个元素存储在一个属性里,比如 mylist.last_added

这种方法如果扩展到其他列表的方法,会有一个好处,就是你可以创建一个类,它可以跟踪最后添加的元素的索引,无论你是用什么方法添加的(比如 insertappend,或者直接用 mylist[some_index] = some_value 赋值)。

把这些信息嵌入到列表对象中的另一个好处是,你可以在不同的地方使用它,而不需要担心命名空间的问题(比如即使你的列表是通过 returnyield 传递的,你也能获取到这些信息)。

34

li[-1] 是列表中的最后一个项目,也就是最近添加到列表末尾的那个:

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

如果你需要的是索引,而不是项目本身,那么 len(li) - 1 就可以了,而且效率很高(因为 len(li) 的计算是非常快速的 - 下面会解释)


在 CPython 的源代码中,列表的 len 函数对应于 Objects/listobject.c 文件中的 list_length 函数:

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

Py_SIZE 只是一个宏,用来访问所有 Python 对象的大小属性,这个宏在 Include/object.h 中定义:

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

因此,len(lst) 实际上只涉及一次指针解引用。

撰写回答