2014-09-15 4 views
0

je dois évaluer la compréhension de la liste suivante:Comment améliorer cette compréhension de la liste

[r for r in listOfList if 
    1 not in [lst[i] for i in r] and 
    0 in  [lst[i] for i in r] 
] 

C'est, je dois obtenir comme résultat une liste de listes (des nombres), où chacun d'eux a aucun élément égal à 1, mais au moins un élément égal à 0.
Comme vous pouvez le voir il ya la répétition de [lst[i] for i in r].
Existe-t-il un moyen d'améliorer l'évaluation de ma compréhension de la liste?

Exemples:

listOfList = [[0, 1, 2], [3, 4, 5], [6, 7, 8], 
[0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]] 

lst = [0, 1, None, None, None, 1, None, None, 0] 
+0

Que recherchez-vous exactement? Pourquoi avez-vous une variable nommée 'list', et qu'est-ce qui est (ou pourrait l'être)? Seulement des zéros et des uns? – jonrsharpe

+0

@jonrsharpe 'list' peut être rempli avec les valeurs 1, 0 et None. – Nick

+1

Pourriez-vous fournir quelques exemples de 'listOfList' et' list' (ne le nommez pas, il ombrage le built-in)? – jonrsharpe

Répondre

2

Vous pouvez utiliser une boucle imbriquée pour calculer le sous-ensemble de lst premier, ou vous pouvez utiliser le any() function d'utiliser une expression du générateur et de limiter le nombre d'itérations:

en utilisant une boucle de liste imbriquée:

[r for r in listOfList 
    for indexed in ({lst[i] for i in r},) 
    if 1 not in indexed and 0 in indexed] 

J'ai aussi changé le sous-ensemble vient m lst pour utiliser des tests d'appartenance à temps constant plus rapides.

En utilisant any():

[r for r in listOfList 
    if not any(lst[i] == 1 for i in r) and 
     any(lst[i] == 0 for i in r)] 

any() s'arrêtera sur le générateur itérer le moment une expression qui est à True rencontrée.

+0

Y a-t-il une amélioration de la performance/mémoire en utilisant le premier plutôt que le dernier? Veuillez remplacer votre 0 par 1 (et vice versa) dans le cas "any". – Nick

+0

@Nick: cela dépend de la taille des sous-ensembles, de la distribution et de la probabilité des valeurs '0' et' 1'. Créer un grand ensemble avec des milliers d'éléments peut être plus cher que les tests 'any()' si vous pouvez déterminer assez rapidement qu'un '1' ou' 0' est présent simplement en regardant les premiers éléments, par exemple. –

Questions connexes