J'ai donc une liste de tuples comme celle-ci:
[(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")]
Je veux cette liste pour un tuple dont la valeur numérique est égale à quelque chose.
Si je le fais search(53)
, la valeur d'index de2
Y a-t-il un moyen facile de faire ceci?
Vous pouvez utiliser une compréhension de liste :
la source
tl; dr
Une expression de générateur est probablement la solution la plus performante et la plus simple à votre problème:
Explication
Il existe plusieurs réponses qui fournissent une solution simple à cette question avec des compréhensions de liste. Bien que ces réponses soient parfaitement correctes, elles ne sont pas optimales. Selon votre cas d'utilisation, il peut y avoir des avantages importants à apporter quelques modifications simples.
Le principal problème que je vois avec l'utilisation d'une compréhension de liste pour ce cas d'utilisation est que la liste entière sera traitée, bien que vous ne souhaitiez trouver qu'un élément .
Python fournit une construction simple qui est idéale ici. Cela s'appelle l' expression du générateur . Voici un exemple:
Nous pouvons nous attendre à ce que cette méthode fonctionne essentiellement de la même manière que les compréhensions de liste dans notre exemple trivial, mais que se passe-t-il si nous travaillons avec un ensemble de données plus grand? C'est là que l'avantage d'utiliser la méthode du générateur entre en jeu. Plutôt que de construire une nouvelle liste, nous utiliserons votre liste existante comme notre itérable, et utiliserons
next()
pour obtenir le premier élément de notre générateur.Voyons comment ces méthodes fonctionnent différemment sur certains ensembles de données plus volumineux. Ce sont de grandes listes, faites de 10000000 + 1 éléments, avec notre cible au début (meilleur) ou à la fin (pire). Nous pouvons vérifier que ces deux listes fonctionneront de la même manière en utilisant la compréhension de liste suivante:
Compréhensions de listes
"Pire cas"
"Meilleur cas"
Expressions de générateur
Voici mon hypothèse pour les générateurs: nous verrons que les générateurs fonctionneront nettement mieux dans le meilleur des cas, mais de même dans le pire des cas. Ce gain de performance est principalement dû au fait que le générateur est évalué paresseusement, ce qui signifie qu'il ne calculera que ce qui est nécessaire pour produire une valeur.
Pire cas
Meilleur cas
QUELLE?! Le meilleur cas emporte les compréhensions de liste, mais je ne m'attendais pas à ce que notre pire cas surpasse les compréhensions de liste à un tel point. Comment c'est? Franchement, je ne pouvais que spéculer sans autre recherche.
Prenez tout cela avec un grain de sel, je n'ai pas exécuté de profilage robuste ici, juste des tests très basiques. Cela devrait être suffisant pour apprécier qu'une expression de générateur est plus performante pour ce type de recherche de liste.
Notez que tout cela est du python intégré de base. Nous n'avons pas besoin d'importer quoi que ce soit ou d'utiliser des bibliothèques.
J'ai vu cette technique pour la première fois dans le cours Udacity cs212 avec Peter Norvig.
la source
Vos tuples sont essentiellement des paires clé-valeur - un python -
dict
donc:Edit - aha, vous dites que vous voulez la valeur d'index de (53, "xuxa"). Si c'est vraiment ce que vous voulez, vous devrez parcourir la liste d'origine, ou peut-être créer un dictionnaire plus compliqué:
la source
l = [(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")] val = dict(l).get(53)
Hmm ... eh bien, le moyen simple qui me vient à l'esprit est de le convertir en dict
et l'accès
d[53]
.EDIT : Oups, vous avez mal lu votre question la première fois. Il semble que vous vouliez réellement obtenir l'index où un nombre donné est stocké. Dans ce cas, essayez
au lieu d'un simple vieux
dict
conversion . Ced[53]
serait alors 2.la source
En supposant la liste peut être longue et le nombre peut répéter, envisager d' utiliser le SortedList type à partir du module Python . Le type SortedList maintiendra automatiquement les tuples dans l'ordre par numéro et permettra une recherche rapide.
Par exemple:
Cela fonctionnera beaucoup plus rapidement que la suggestion de compréhension de liste en effectuant une recherche binaire. La suggestion de dictionnaire sera encore plus rapide mais ne fonctionnera pas s'il peut y avoir des nombres en double avec des chaînes différentes.
S'il y a des numéros en double avec des chaînes différentes, vous devez faire une étape de plus:
En divisant 54 en deux, nous trouverons l'index de fin de notre tranche. Ce sera nettement plus rapide sur les longues listes par rapport à la réponse acceptée.
la source
Juste une autre façon.
la source
[k pour k, v dans l si v == ' delicia ']
voici la liste des tuples - [(1, "juca"), (22, "james"), (53, "xuxa"), (44, "delicia")]
Et au lieu de le convertir en dict, nous utilisons la compréhension de liste.
*Key* in Key,Value in list, where value = **delicia**
la source