是否有一种简单的方法来获取我刚刚附加到列表中的项目的索引?我需要跟踪最后添加的项目。
我提出了两种可能的解决方案:
# 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]
是否有获取附加项索引的技巧?
如果没有,您会使用以上哪个以及为什么?你建议的任何不同的解决方法?
答案 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}}。