Python检查列表的第一个和最后一个索引
假设我有包含对象的object_list列表。Python检查列表的第一个和最后一个索引
我想检查我的当前迭代是在第一个还是最后一个。
for object in object_list:
do_something
if first_indexed_element:
do_something_else
if last_indexed_element:
do_another_thing
这怎么能实现?我知道我可以使用范围和数量指数,但如果感觉笨拙。
问候
li = iter(object_list)
obj = next(li)
do_first_thing_with(obj)
while True:
try:
do_something_with(obj)
obj = next(li)
except StopIteration:
do_final_thing_with(obj)
break
您可以使用enumerate()
:
for i, obj in enumerate(object_list):
do_something
if i == 0:
do_something_else
if i == len(object_list) - 1:
do_another_thing
但不是在每次迭代哪个对象正在处理的,也许这样的事情是检查好:
def do_with_list(object_list):
for obj in object_list:
do_something(obj)
do_something_else(object_list[0])
do_another_thing(object_list[-1])
想象你有一个100个对象的列表,那么你做了198次不必要的比较,因为当前元素不能是列表中的第一个或最后一个元素。
但这取决于语句是否必须以特定顺序执行以及它们在做什么。
Btw。不影object
,它已经在Python的标识符;)
'i'永远等于'LEN(object_list中)'。 – Amber 2010-08-03 08:13:57
@Amber:对,谢谢 – 2010-08-03 08:14:46
for index, obj in enumerate(object_list):
do_something
if index == 0:
do_something_else
if index == len(object_list)-1:
do_another_thing
如果object_list是迭代器,会中断。最好编写可用于所有迭代的代码,而不仅仅是列表。 – 2010-08-03 10:04:09
不是因为它使代码阅读起来更复杂,而且你知道你将要使用列表。 – Amber 2010-08-03 15:58:50
你只需要使用一个计数器,无需范围:
比方说,你的计数器是cpt
。
if cpt == 0:
print "first"
if cpt == len(object_list) - 1:
print "last"
编辑:该枚举的解决方案可能是更优雅。
- 您可以使i = 0,然后i ++在迭代中。所以如果我== 0它是第一次迭代,如果我== list.size() - 1比它是最后一次迭代。
- 必须有像indexOf(对象)这样的返回值,它返回列表中元素的位置。如果0 - 比第一次迭代,如果size() - 1比最后一次。但它很昂贵。
- 使用枚举。请参阅琥珀或Felix帖子。
- 比较当前元素列表[0]和列表[-1]。在第一种情况下 - 第一次迭代,在最后一种情况下 - 最后一次迭代。它也很贵。
所以我就选择1或3
PS:则为list.size()当然是len(名单)。
4.为什么要贵?列表访问应该是'O(1)'。 – 2010-08-03 08:22:30
不知道什么是O(1),但比较自定义对象,imho,比较数字总是比较慢(即使它们也是对象)。此外,在这种情况下,您应该提供平等规则,这可能非常复杂。此外,列表可以包含重复项,因此它可能会导致错误(这是不同的观点,但您必须考虑它)。 – foret 2010-08-03 08:47:22
此外! :当您尝试从列表中获取元素时,python首先查找列表,然后在索引处查找元素。如果你使用号码,它只能找到号码,所以1次操作少一点。 imho - 我不知道python的内幕。 – foret 2010-08-03 08:56:04
first = True
for o in object_list:
do_something(o)
if first:
first = False
do_something_with_first(o)
if 'o' in locals():
do_something_with_last(o)
+1代替索引号使用迭代器。在OP的问题中,所有对象都使用do_something进行处理,并且使用第一个和最后一个进行特殊处理。在你的代码中,你为第一个项目做了特殊处理,而不是每个项目的处理。我认为你只需要在你的try语句中颠倒2个语句来获得所需的行为。 – PaulMcG 2010-08-03 08:41:44
非常复杂。不完全是作者想要的('do_first_thing_with'应在首次调用'do_something_with'后调用)。 – 2010-08-03 10:02:30
可能是最有效的解决方案(+1),但不幸的是不是很简洁/易于理解。 – wds 2010-08-03 10:04:48