Comment obtenir des éléments communs dans une liste imbriquée profonde : mes deux solutions fonctionnent mais prennent du temps

J'ai une structure de liste imbriquée comme ci-dessous. Chacune des 4 structures imbriquées représente pour moi des positions libres. Je veux trouver quels éléments sont présents dans les 4 listes imbriquées.

ary=[ [[0, 4], [5, 11]], [[0, 2], [0, 4], [5,10]], [[0, 4], [0, 14], [5,11]], [[0, 4], [0, 14], [5,11]] ]

Comme ci-dessus, dans la première liste imbriquée [[0, 4], [5, 11]], le [0,4]est présent dans tous mais [5,11]ne l'est pas. Par conséquent, ma réponse devrait être [[0,4]] ou même juste [0,4].

Je l'ai fait de deux manières.
Solution1 :

 ary1=ary
newlist = [item for items in ary for item in items]
x=[i for i in ary[0] if newlist.count(i)== len(ary1)]
#OUTPUT is x= [[0,4]]

Solution2 :

x=[] 
for u in ary[0]:
n=[]
n=[1 for t in range(1,len(ary)) if u in ary[t]]
if len(ary)-1==len(n):
x.append(u)
#OUTPUT is x= [[0,4]]

Ces deux éléments semblent prendre un temps de calcul similaire lorsqu'ils sont vérifiés à l'aide du profileur de ligne. Et c'est le seul point de calcul lourd dans mes centaines de privilèges de code et je veux réduire cela. Alors, pouvez-vous suggérer d'autres commandes/codes Python qui peuvent mieux faire la tâche que ces deux solutions ?


Solution du problème

Vous pouvez essayer de convertir chaque tableau imbriqué au deuxième niveau dans l'ensemble de tuples, où chaque tableau de niveau le plus bas (c'est-à-dire [0,4]) est un élément de l'ensemble. La conversion en tuples est nécessaire car les listes ne sont pas hachables. Une fois que vous avez chaque liste imbriquée de listes en tant qu'ensemble, trouvez simplement leur intersection.

set.intersection(*[set(tuple(elem) for elem in sublist) for sublist in ary])

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"