2014-01-24 170 views
2

我有這樣的列表:的Python:計數,直到在列表元素是一個元組

MyList = [2,3,(1,2),5] 

其中元素0,1和3是整數,而元件2是一個元組。我想創建一個計數器,告訴我在元組來到之前,列表中有多少元素。 在這個例子中,我想要一個計數器,它將取值2(2元素,2和3,在第一個元組之前)。我曾嘗試以下:

counter = 0 
while MyList[counter] is not tuple: 
    counter = counter + 1 

,但它不工作,因爲當它評估的聲明「(1,2)不是元組」,而不是提出虛假它不斷,取值爲真。有什麼想法可以解決問題,以及如何解決問題?謝謝。

+1

嘗試'isinstance'或'型(MYLIST [計數器]' –

回答

9

您可以使用for循環和break出來:

counter = 0 
for elem in MyList: 
    if isinstance(elem, tuple): 
     break 
    counter += 1 

,或者使用enumerate()

for counter, elem in enumerate(MyList): 
    if isinstance(elem, tuple): 
     break 

# counter *could* be unbound if `MyList` is empty 

或者您可以使用itertools.takewhile()

from itertools import takewhile 

counter = sum(1 for elem in takewhile(lambda e: not isinstance(e, tuple), MyList)) 

後一種方法的演示:

>>> from itertools import takewhile 
>>> MyList = [2,3,(1,2),5] 
>>> sum(1 for elem in takewhile(lambda e: not isinstance(e, tuple), MyList)) 
2 
+0

非常感謝,簡單清晰,完整:) –

8

使用isinstance()確定對象的類型:

>>> counter = 0 
>>> while not isinstance(MyList[counter], tuple): 
...  counter += 1 
... 
>>> counter 
2 
3
for i, e in enumerate([2,3,(1,2),5]): 
    if isinstance(e, tuple): 
    break 
print i 

實際上,這爲find()用例一個例子。不幸的是,Python不提供一個開箱即用的功能。有了它,它將只是:

return find(lambda e: isinstance(e, tuple), [2,3,(1,2),5]) 
6

只需使用一個發電機。這是你最簡單的。

next(index for index, elem in enumerate(MyList) if isinstance(elem, tuple)) 
+0

我不知道......創造了這個新的列表? –

+0

@TimPietzcker:可能在發生器上使用Sum? – Abhijit

+0

好吧,那是Martijn的回答。 –

1
cnt = 0 
elem = MyList[cnt] 
while isinstance(elem, int): 
    cnt+= 1 
    elem = MyList[cnt] 
return cnt 
相關問題