0
votes

Façon la plus efficace de rechercher la liste des listes de Python sur plusieurs champs?

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: xxx

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 xxx

il peut y avoir plusieurs correspondances à cette requête

Quelle est la meilleure / la plus pythonique Pour ce faire?


5 commentaires

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


4 Réponses :


0
votes

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)


0 commentaires

2
votes

Vous pouvez utiliser une compréhension de liste: xxx


0 commentaires

1
votes

La compréhension de la liste fonctionnerait ici:

filtered = [mylist for mylist in mainlist if mainlist[0] == 'B' and mainlist[1] == 'B1']


0 commentaires

0
votes

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', {}]


0 commentaires