Tableaux, filtres, Python Ruby

Le
LL.Snark
Bonjour,

Je cherche le moyen le plus propre de traduire en python cette ligne de
Ruby :
t=[6,7,8,6,7,9,8,4,3,6,7]
i=t.index {|x| x<t[0]}


C'est la seconde ligne qui m'intéresse :) Elle signifie, pour celles et
ceux qui ne connaissent pas Ruby :
Rechercher l'indice, dans le tableau t, du premier élément x tel que x<t[0]
On trouve donc l'indice de la première case qui contient un élément plus
petit que la case initiale.

Je sais l'écrire en Python :
t=[6,7,8,6,7,9,8,4,3,6,7]
i=0
while t[i]>=t[0] : i+=1

Mais j'aimerais savoir s'il y a un moyen plus "typique" (en utilisant
des trucs genre filter peut être ?)
Il y a bien ceci :
t=[6,7,8,6,7,9,8,4,3,6,7]
i=[j for j in range(len(t)) if t[j]<t[0]][0]

mais je trouve que c'est illisible

Je suis intéressé par des solutions qui fonctionnent avec Python 3.

Par avance merci.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Bruno Piguet
Le #23116621
Le Fri, 11 Feb 2011 22:18:34 +0100, LL.Snark a écrit:

Bonjour,

Je cherche le moyen le plus propre de traduire en python cette ligne de
Ruby :
t=[6,7,8,6,7,9,8,4,3,6,7]
i=t.index {|x| x<t[0]}



J'aurais deux suggestions, suivant le fait que parcourir toute la liste
est gênant ou pas.
La première, qui parcourra toute la liste, mais qui me semble simple et
lisible :
t=[6,7,8,6,7,9,8,4,3,6,7]
[x<t[0] for x in t].index(True)

La seconde, qui s'arrêtera au premier élément remplissant la condition,
mais qui peut être moins lisible a priori :
next(i for i, x in enumerate(t) if x<t[0])

Si il y a un risque qu'il n'y ait pas d'élément répondant à la condition,
utiliser le second argument :
next((i for i, x in enumerate(t) if x>1000), "pas trouve")
ou
next((i for i, x in enumerate(t) if x>1000), None)

Bruno.
Publicité
Poster une réponse
Anonyme