2010-08-03 153 views
9

假设我有包含对象的object_list列表。Python检查列表的第一个和最后一个索引

我想检查我的当前迭代是在第一个还是最后一个。

for object in object_list: 
    do_something 
    if first_indexed_element: 
     do_something_else 
    if last_indexed_element: 
     do_another_thing 

这怎么能实现?我知道我可以使用范围和数量指数,但如果感觉笨拙。

问候

回答

12
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 
+1

+1代替索引号使用迭代器。在OP的问题中,所有对象都使用do_something进行处理,并且使用第一个和最后一个进行特殊处理。在你的代码中,你为第一个项目做了特殊处理,而不是每个项目的处理。我认为你只需要在你的try语句中颠倒2个语句来获得所需的行为。 – PaulMcG 2010-08-03 08:41:44

+1

非常复杂。不完全是作者想要的('do_first_thing_with'应在首次调用'do_something_with'后调用)。 – 2010-08-03 10:02:30

+0

可能是最有效的解决方案(+1),但不幸的是不是很简洁/易于理解。 – wds 2010-08-03 10:04:48

14

您可以使用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的标识符;)

+1

'i'永远等于'LEN(object_list中)'。 – Amber 2010-08-03 08:13:57

+0

@Amber:对,谢谢 – 2010-08-03 08:14:46

3
for index, obj in enumerate(object_list): 
    do_something 
    if index == 0: 
     do_something_else 
    if index == len(object_list)-1: 
     do_another_thing 
+0

如果object_list是迭代器,会中断。最好编写可用于所有迭代的代码,而不仅仅是列表。 – 2010-08-03 10:04:09

+0

不是因为它使代码阅读起来更复杂,而且你知道你将要使用列表。 – Amber 2010-08-03 15:58:50

0

你只需要使用一个计数器,无需范围:

比方说,你的计数器是cpt

if cpt == 0: 
    print "first" 

if cpt == len(object_list) - 1: 
    print "last" 

编辑:该枚举的解决方案可能是更优雅。

0
  1. 您可以使i = 0,然后i ++在迭代中。所以如果我== 0它是第一次迭代,如果我== list.size() - 1比它是最后一次迭代。
  2. 必须有像indexOf(对象)这样的返回值,它返回列表中元素的位置。如果0 - 比第一次迭代,如果size() - 1比最后一次。但它很昂贵。
  3. 使用枚举。请参阅琥珀或Felix帖子。
  4. 比较当前元素列表[0]和列表[-1]。在第一种情况下 - 第一次迭代,在最后一种情况下 - 最后一次迭代。它也很贵。

所以我就选择1或3
PS:则为list.size()当然是len(名单)。

+0

4.为什么要贵?列表访问应该是'O(1)'。 – 2010-08-03 08:22:30

+0

不知道什么是O(1),但比较自定义对象,imho,比较数字总是比较慢(即使它们也是对象)。此外,在这种情况下,您应该提供平等规则,这可能非常复杂。此外,列表可以包含重复项,因此它可能会导致错误(这是不同的观点,但您必须考虑它)。 – foret 2010-08-03 08:47:22

+0

此外! :当您尝试从列表中获取元素时,python首先查找列表,然后在索引处查找元素。如果你使用号码,它只能找到号码,所以1次操作少一点。 imho - 我不知道python的内幕。 – foret 2010-08-03 08:56:04

1
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) 
相关问题