J'ai une structure de données qui est une liste de listes. Chacun des sublistes a 2 cordes et un dictionnaire, donc globalement une structure comme celle-ci: Ce que je veux pouvoir faire est de trouver toutes les sous-listes où les deux premières valeurs faire correspondre certains critères - par exemple lorsque la première valeur est 'B' et la seconde est 'B1'; Si c'était une table de base de données, l'équivalent serait quelque chose comme p> il peut y avoir plusieurs correspondances à cette requête p> Quelle est la meilleure / la plus pythonique Pour ce faire? p> p>
4 Réponses :
Essayez:
my_list = [ [ 'A', 'A1', { .... }], [ 'A', 'A2', { .... }], [ 'B'. 'B1', { .... }], .... ] results = [] for item in my_list: if item[0] == <criteria1> and item[1] == <criteria2>: results.append(item)
Vous pouvez utiliser une compréhension de liste:
La compréhension de la liste fonctionnerait ici:
filtered = [mylist for mylist in mainlist if mainlist[0] == 'B' and mainlist[1] == 'B1']
Vous pouvez utiliser les fonctions filtre () code> et
itemGetter () code> (il doit être plus rapide qu'une listeComp):
from operator import itemgetter
d = [
['A', 'A1', {}],
['A', 'A2', {}],
['B', 'B1', {}],
]
itemget = itemgetter(0, 1)
result = filter(lambda x: itemget(x) == ('B', 'B1'), d)
for i in result:
print(i)
# ['B', 'B1', {}]
Je pense que la meilleure chose à faire ici n'est que retravaçonner pour utiliser une liste de dictionnaires imbriqués
Si votre sortie est une liste comme votre entrée, vient de filtrer?
Vous devez faire une recherche linéaire
@Peter_danneman: J'avais à l'origine la structure comme un dictionnaire avec une clé d'un tuple des deux colonnes, mais cela a rendu vraiment mal de travailler avec plus tard dans le code
@Docdriven - Oui - Dans la plupart des cas, je m'attends à 0 ou 1 résultats. C'est une chose de merde à faire, car la vitesse des tests sera pire de manière exponentielle car la liste extérieure augmente, mais il n'y aura jamais plus de 1000-1500 entrées dans la liste extérieure