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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Bruno Piguet
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.
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)
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)