2010-08-03 132 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) 
相關問題