2017-07-07 1 views
0

Imaginer une liste comme:Comment trouver une intersection de sous-listes de sous-listes dans Python3.0?

SuperList = [[[1,2,3],[1,2,4]],[[6,3,1],[9,0,4]]] 

Comme vous pouvez le voir, j'ai une sous-liste dans une sous-liste. Comment puis-je le coder pour trouver l'intersection de ces sous-listes? Dans ce cas, la réponse est 1,3 et 4. Mon but est d'ajouter tous les éléments apparaissant au moins une fois dans chaque sous-liste dans une nouvelle liste (peu importe si elle apparaît dans toutes les sous-listes d'une sous-liste)

J'ai essayé avec set.intersection, mais toujours je reçois

'unhashable type: 'list'' 

ou en essayant de dérouler la liste que je reçois

'can't use the starred expression here'! 
+0

Est-ce vous essayez de trouver le «1» se produit n'importe où, ou en essayant de trouver la sous-liste exacte dans laquelle se produit? – randomir

Répondre

0

Vous pouvez aplatir les sous-listes et de prendre leur intersection en utilisant set.intersection:

>>> set.intersection(*[{x for lst in sub for x in lst} for sub in SuperList]) 
set([1, 3, 4]) 
+0

Moïse es-tu Moïse? Merci mec! J'apprécie beaucoup! J'avais travaillé sur ce 10 heures 15 et à la fin c'était si simple! Le programmeur novice lutte je suppose! Merci encore! –

0

On ne sait pas de votre question ce que vous essayez de faire exactement , mais si vous essayez de test pour l'existence d'un élément (par exemple 1) dans l'une des sous-listes, vous pouvez d'abord aplatir la "super liste", et de faire un ensemble de cette liste.

Nous pouvons le faire en une seule fois avec flatset():

def flatset(lst): 
    try: 
     return set(lst) 
    except TypeError: 
     s = set() 
     for item in lst: 
      s.update(flatset(item)) 
     return s 

Par exemple:

>>> superlist = [[[1,2,3],[1,2,4]],[[6,3,1],[9,0,4]]] 
>>> flatset(superlist) 
set([0, 1, 2, 3, 4, 6, 9]) 
>>> 1 in flatset(superlist) 
True