/ / Python: рахувати, поки елемент у списку не є кортежем - python, list, python-2.7, tuples

Python: count до елемента у списку - кортеж - python, list, python-2.7, кортеж

У мене є такий список:

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) не кортежиться", а не піднімає False, він продовжує приймати значення True. Будь-яке уявлення про те, що може бути проблемою і як я можу її вирішити? Спасибі.

Відповіді:

9 для відповіді № 1

Ви можете використовувати a 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

8 для відповіді № 2

Використовуйте isinstance() для визначення типу об'єкта:

>>> counter = 0
>>> while not isinstance(MyList[counter], tuple):
...     counter += 1
...
>>> counter
2

6 за відповідь № 3

Просто використовуйте генератор. Це найпростіший ви можете.

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

3 для відповіді № 4
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])

1 для відповіді № 5
cnt = 0
elem = MyList[cnt]
while isinstance(elem, int):
cnt+= 1
elem = MyList[cnt]
return cnt