J'ai un ensemble d'entiers connexes que je dois rechercher dans un grand nombre de données, et je me demande ce qui est considéré comme la méthode la plus efficace ou la plus pythonique pour y parvenir.

Par exemple, si j'ai une liste d'entiers:

query = [1,5,7,8]

Et besoin de trouver tous les objets qui contiennent ces valeurs:

record_1 = [0,5,7,8,10,11,12]
record_2 = [1,3,5,8,10,13,14]
record_3 = [1,4,5,6,7,8,11]
record_4 = [1,5,6,7,8,10,14]
record_5 = [1,5,8,9,11,13,16]

Je sais qu'il ne serait pas trop difficile de charger chaque enregistrement dans une liste plus grande et de tester chacun de manière itérative s'ils contiennent ou non tous les entiers trouvés dans la requête, mais je me demande s'il y en a plus Façon pythonique de le faire, ou s'il existe une méthode plus efficace que de tester chaque valeur (qui deviendra chère lors de la mise à l'échelle).

Merci d'avance!

0
baroquebassoon 17 mars 2019 à 20:27

2 réponses

Meilleure réponse

Si les nombres dans les requêtes et les enregistrements sont uniques, je les représenterais comme un sets (ou des ensembles gelés pour de meilleures performances). Supposons que vous ayez une liste d'enregistrements et une requête :

La fonction de filtre est appliquée sur la liste des enregistrements. Pour chaque enregistrement, la fonction lambda est exécutée pour voir si elle est vraie. La fonction lambda vérifie si la requête est un sous-ensemble de l'enregistrement en cours. Ainsi, la liste filtrée contient nos résultats. Le résultat est converti en liste.

query = set([1,5,7,8])

records = [
    set([0,5,7,8,10,11,12]),
    set([1,3,5,8,10,13,14]),
    set([1,4,5,6,7,8,11]),
    set([1,5,6,7,8,10,14]),
    set([1,5,8,9,11,13,16]),
]

matches = list(filter(lambda r: query.issubset(r), records))
print(matches)

Production:

[{1, 4, 5, 6, 7, 8, 11}, {1, 5, 6, 7, 8, 10, 14}]
3
H4kor 17 mars 2019 à 19:17

Utilisation de list map avec issubset

for y,x in zip(records,map(lambda x : query.issubset(x),records)):
    if x :
        print(y)


{1, 4, 5, 6, 7, 8, 11}
{1, 5, 6, 7, 8, 10, 14}
0
BENY 17 mars 2019 à 19:14