4 votes

Filtrer une liste de listes de tuples

J'ai une liste de listes de tuples :

oldList = [[(1,None),(2,45),(3,67)],[(1,None), (2,None), (3,None),(4,56),(5,78)],[(1, None),(2, 98)]]

Je voudrais filtrer toute occurrence de "None" :

newList = [[(2,45),(3,67)], [(4,56),(5,78)], [(2, 98)]]

Le plus proche que je suis arrivé est avec cette boucle, mais elle ne supprime pas le tuple entier (seulement le 'None') et elle détruit également la structure de liste de listes de tuples :

newList = []
for data in oldList:
    for point in data:
        newList.append(filter(None,point))

7voto

user108471 Points 154

Le moyen le plus court de le faire est avec une compréhension de liste imbriquée:

>>> newList = [[t for t in l if None not in t] for l in oldList]
>>> newList
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]]

Vous devez imbriquer deux compréhensions de liste car vous traitez avec une liste de listes. La partie extérieure de la compréhension de liste [[...] for l in oldList] s'occupe d'itérer à travers la liste extérieure pour chaque liste intérieure contenue. Ensuite, à l'intérieur de la compréhension de liste intérieure, vous avez [t for t in l if None not in t], ce qui signifie simplement que vous voulez chaque tuple dans la liste qui ne contient pas de None.

(On pourrait arguer qu'il serait préférable de choisir de meilleurs noms que l et t, mais cela dépendrait de votre domaine de problème. J'ai choisi des noms d'une seule lettre pour mieux mettre en évidence la structure du code.)

Si vous n'êtes pas familier ou à l'aise avec les compréhensions de liste, cela équivaut logiquement à ce qui suit:

>>> newList = []
>>> for l in oldList:
...     temp = []
...     for t in l:
...         if None not in t:
...             temp.append(t)
...     newList.append(temp)
...
>>> newList
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]]

1voto

Moinuddin Quadri Points 27539

Vous devez créer une liste temporaire à l'intérieur de votre premier for loop pour maintenir la structure imbriquée de la liste comme suit :

>>> new_list = []
>>> for sub_list in oldList:
...     temp_list = []
...     for item in sub_list:
...         if item[1] is not None:
...             temp_list.append(item)
...     new_list.append(temp_list)
...
>>> new_list
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]]

Alternativement, une meilleure façon d'atteindre le même résultat est d'utiliser une expression de compréhension de liste comme suit :

>>> oldList = [[(1,None),(2,45),(3,67)],[(1,None), (2,None), (3,None),(4,56),(5,78)],[(1, None),(2, 98)]]
>>> [[(k, v) for k, v in sub_list if v is not None ] for sub_list in oldList]
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]]

0voto

kiran.koduru Points 1831

Pourquoi ne pas simplement ajouter un bloc if pour vérifier si le premier élément de votre tuple point existe ou est True. Vous pouvez également utiliser la compréhension de liste mais je suppose que vous êtes nouveau en python.

oldList = [[(1,None),(2,45),(3,67)],[(1,None), (2,None), (3,None),(4,56),(5,78)],[(1, None),(2, 98)]]

newList = []
for data in oldList:
    tempList = []
    for point in data:
        if point[1]:
            tempList.append(point)
    newList.append(tempList)

print newList
>>> [[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]]

0voto

Christian Dean Points 14809

Les tuples sont immuables, vous ne pouvez donc pas les modifier. Vous devez les remplacer. De loin, la manière la plus canonique de le faire est d'utiliser la compréhension de liste de Python :

>>> oldList = [[(1, None), (2, 45), (3, 67)],[(1, None), (2, None), (3, None), (4, 56), (5, 78)],[(1, None), (2, 98)]]
>>> [[tup for tup in sublist if not None in tup] for sublist in oldList]
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]]
>>>

0voto

Simeon Aleksov Points 760

Compréhensions de liste :

>>> newList = [[x for x in lst if None not in x] for lst in oldList]
>>> newList
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]]
>>>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X