Quel serait le moyen le plus pythonique de trouver le premier index d'une liste qui est supérieur à x?
Par exemple, avec
list = [0.5, 0.3, 0.9, 0.8]
La fonction
f(list, 0.7)
retournerais
2.
next(x[0] for x in enumerate(L) if x[1] > 0.7)
si list est trié, bisect_left(alist, value)
est plus rapide pour une grande liste que next(i for i, x in enumerate(alist) if x >= value)
.
filter(lambda x: x>.7, seq)[0]
>>> alist= [0.5, 0.3, 0.9, 0.8]
>>> [ n for n,i in enumerate(alist) if i>0.7 ][0]
2
for index, elem in enumerate(elements):
if elem > reference:
return index
raise ValueError("Nothing Found")
Un autre:
map(lambda x: x>.7, seq).index(True)
J'ai eu le même problème quand ma liste était très longue. les solutions de compréhension ou basées sur les filtres iraient à travers toute la liste. itertools.takewhile cassera la boucle lorsque la condition deviendra fausse une première fois:
from itertools import takewhile
def f(l, b): return len([x for x in takewhile(lambda x: x[1] <= b, enumerate(l))])
l = [0.5, 0.3, 0.9, 0.8]
f(l, 0.7)
Je sais que les réponses sont déjà nombreuses, mais j’ai parfois l’impression que le mot Pythonic se traduit par «one-liner».
Quand je pense qu'une meilleure définition est plus proche de cette réponse :
"Exploiter les fonctionnalités du langage Python pour produire un code clair, concis et maintenable."
Bien que certaines des réponses ci-dessus soient concises, je ne les trouve pas claires et il faudrait un certain temps à un programmeur débutant pour comprendre, et donc ne pas les rendre extrêmement maintenables pour une équipe composée de nombreux niveaux de compétences.
l = [0.5, 0.3, 0.9, 0.8]
def f(l, x):
for i in l:
if i >x: break
return l.index(i)
f(l,.7)
ou
l = [0.5, 0.3, 0.9, 0.8]
def f(l, x):
for i in l:
if i >x: return l.index(i)
f(l,.7)
Je pense que ce qui précède est facilement compris par un débutant et reste suffisamment concis pour être accepté par tout programmeur python expérimenté.
Je pense qu'écrire code muet est positif.
>>> f=lambda seq, m: [ii for ii in xrange(0, len(seq)) if seq[ii] > m][0]
>>> f([.5, .3, .9, .8], 0.7)
2