web-dev-qa-db-fra.com

Premier index de liste Python supérieur à x?

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.
55
c00kiemonster
next(x[0] for x in enumerate(L) if x[1] > 0.7)
75

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).

17
jfs
filter(lambda x: x>.7, seq)[0]
13
flybywire
>>> alist= [0.5, 0.3, 0.9, 0.8]
>>> [ n for n,i in enumerate(alist) if i>0.7 ][0]
2
10
ghostdog74
for index, elem in enumerate(elements):
    if elem > reference:
        return index
raise ValueError("Nothing Found")
4
Virgil Dupras

Un autre:

map(lambda x: x>.7, seq).index(True)
3
flybywire

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)
1
lowtech

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.

0
Jeff Tilton
>>> 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
0
flybywire