获取最近附加项的索引

2024-04-29 22:50:22 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种简单的方法来获取我刚刚添加到列表中的项的索引?我需要跟踪上次添加的项目。

我想出了两个可能的解决方案:

# 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]

有没有技巧可以得到附加项的索引?

如果没有,你会用上面哪一个?为什么?你有什么建议吗?


Tags: ofthe项目方法列表addedindexlen
3条回答

你可以从两边为列表建立索引。最后一个元素的索引总是-1,不需要调用len。在开始处重复插入是非常低效的(需要将列表中的所有元素下移一个位置)。

第三种可能的解决方案是对list进行子类划分并重写append方法,以便它在调用时自动存储在类似mylist.last_added的属性中。

这种方法(如果扩展到其他列表方法)的优点是,您可以潜在地创建一个类,在该类中,它将跟踪最后添加的元素的索引,而不管使用的方法是什么(insertappend,还是简单的mylist[some_index] = some_value)。

在list对象中嵌入此信息的另一个优点是,您可以传递它而不必担心名称空间(例如,即使列表是由returnyield传递的,您也可以检索它)。

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对象的size属性,定义于Include/object.h

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

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

相关问题 更多 >