У мене є такий список:
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