Utiliser python3.4 J'essaie de filtrer une base de règles de pare-feu exportée en JSON et convertie en dictionnaire. Je veux filtrer basé sur des critères définis par l'utilisateur mais je ne peux pas sembler pouvoir faire cela sans constructions difficiles à lire avec beaucoup de boucles et si des déclarations.Filtrer le dictionnaire d'une manière simple et lisible
La dict de mes entrées de pare-feu est assez grande, donc je les ai raccourci un peu.
2 exemples:
entry1 = {'action': 'accept',
'dstintf': [{'name': 'ZN_HDW', 'q_origin_key': 'ZN_HDW'}],
'srcintf': [{'name': 'ZN_AUDIT', 'q_origin_key': 'ZN_AUDIT'}]
}
entry2 = {'action': 'accept',
'dstintf': [{'name': 'ZN_HDW', 'q_origin_key': 'ZN_HDW'}],
'srcintf': [{'name': 'ZN_DMZ', 'q_origin_key': 'ZN_DMZ'},
{'name': 'ZN_MGMT', 'q_origin_key': 'ZN_MGMT'},
{'name': 'ZN_AUDIT', 'q_origin_key': 'ZN_AUDIT'}]
}
Je voulais créer une structure de données pour comparer contre les 2 exemples et créé à suivre:
filter = {'action': 'accept',
'srcintf': [{'name': 'ZN_AUDIT', 'q_origin_key': 'ZN_AUDIT'}]
}
Après quelques recherches sur la façon de comparer ces structures I a pris fin avec un code lisible. Mon problème est-il n'évalue pas vrai sur inscription2 (qui a plusieurs interfaces source):
>>> filter.items() <= entry1.items()
True
>>> filter.items() <= entry2.items()
False
des conseils sur la façon dont je devrais le faire? Utilisation de la réponse Eric Duminil ci-dessous Je suis capable de créer quelque chose (voir ci-dessous), même si ce n'est toujours pas aussi lisible que je le veux. D'autres conseils?
example = entry2
# Compare entry to filter
noMatch = 0
for key in filter:
if isinstance(example[key], list):
# Convert list of dicts to list for easier comparing
tmpExample = [d['name'] for d in example[key]]
# Break if entry does not contain all criteria
if not all(value in tmpExample for value in filter[key]):
noMatch = 1
print("No match on: " + str(filter[key]))
break
elif filter[key] != example[key]:
# Simple string comparing
noMatch = 1
print("No match on: " + str(filter[key]))
break
if noMatch == 0:
print("Match")
else:
print(" No match")
Merci pour l'aide à ce jour, mais mon résultat est toujours pas très lisible (voir modifier). D'autres conseils? – marvink
@marvink: Voir mise à jour. Il pourrait être un peu plus lisible maintenant. –