0
votes

Recherche dans une liste multidimensionnelle en Python

J'ai une liste de tuples, nommément f = [(1,2,1), (2,3,0), (1,2,4)] .

Si je veux vérifier si (1,2,1) existe dans le f J'utilise f .__ contient __ ((1,2,1) ) .

Mais comment puis-je vérifier si (1,2, juste un numéro) ou (1, n'importe quel numéro, juste un numéro) existe dans la liste? < / p>

J'ai utilisé f .__ contient __ ((1,2, true)) mais n'a pas fonctionné correctement.


3 commentaires

N'utilisez jamais __ contient __ directement, ne pas utiliser les méthodes Dunder directement


f .__ contient __ ((1,2, true)) renvoie true . Pourquoi ne pas simplement utiliser "? (1,2, true) en f


Vous allez avoir à utiliser tout : tout (x [0: 2] == (1,2) pour x en f)


4 Réponses :


1
votes
>>> T = (1, 2)
>>> F = [(1,2,1), (2,3,0), (1,2,4)]
>>> any(filter(lambda x:x[:2]==T, F))
True

2 commentaires

Pouvez-vous expliquer ce que cela fait?


"Filtre" garde les éléments qui passent le test et "tout" renvoie false si cette liste OS vide.



0
votes
(1, 2) in [x[:-1] for x in F]
Note as already commented do not use contains directly

6 commentaires

Ce n'est pas un raccourci. mieux utiliser n'importe quel


@ Jean-Françoisefabre désolé que voulez-vous dire par raccourci? Je suis inconnu


D'accord sur n'importe quel. Essayez tout (x [: 2] == (1, 2) pour x en f) . Faible empreinte mémoire, pas de comparaisons inutiles.


Je veux dire que si la liste comporte 400 000 éléments et le premier élément correspondant, vous créez la liste de toute façon.


Je pense que le terme correct est court-circuit , btw. Tout retournera vrai dès qu'il rencontre un résultat en vérité. Si vous effectuez des compréhensions de liste, vous ferez d'abord tous les calculs, créez une liste potentiellement énorme, puis recherchez cela.


Mais qu'en est-il du cas lors de la recherche de (1, anynumber, 2) ou (1, anynumber, anynumber) ?



1
votes

N'utilisez pas la méthode spéciale __ contient __ directement comme mentionné par d'autres ici. Utilisez l'opérateur d'adhésion dans qui effectue la même tâche.

code xxx


2 commentaires

Mais qu'en est-il du cas lors de la recherche de (1, anynumber, 2) ou (1, anynumber, anynumber) ?


Si tel est le cas, je pense que vous avez besoin d'une chaîne de déclarations if-else .



0
votes

Dans un commentaire Mohammad a demandé une méthode de recherche plus générique. Voici une façon de le faire.

>>> search_2d_list((1,), F)
True
>>> search_2d_list((1,2), F)
True
>>> search_2d_list((1,2,1), F)
True
>>> search_2d_list((1,2,3), F)
False
>>> search_2d_list((2,2,3), F)
False
>>> search_2d_list((2,2), F)
False
>>> search_2d_list((2,None,2), F)
False
>>> search_2d_list((2,None,0), F)
True


1 commentaires

Si vous devrez peut-être correspondre à aucune dans les recherches, vous pouvez définir une base générique de classe et utiliser cela au lieu de non aucun.