2012-02-15 26 views
9

voglio per determinare se un elenco contiene una certa stringa, quindi utilizzare un generatore di espressione, in questo modo:Python generatore di espressione parentesi stranezza

g = (s for s in myList if s == myString) 
any(g) 

Certo che voglio inline questo, così faccio:

any((s for s in myList if s == myString)) 

allora penso che apparirebbe più bello con singole parentesi, così cerco:

any(s for s in myList if s == myString) 
non

davvero espe cting funziona. Sorpresa! lo fa!

Quindi questo Python legale o solo qualcosa che la mia implementazione consente? Se è legale, qual è la regola generale qui?

risposta

11

È legale e la regola generale è che sono necessarie parentesi attorno a un'espressione di generatore. Come eccezione speciale, anche le parentesi di una chiamata di funzione contano (per le funzioni con un solo parametro). (Documentation)

nota che il test se my_string appare in my_list è facile come

my_string in my_list 

Nessuna espressione generatore o chiamare per any() necessario!

+0

Grazie per la risposta. 'my_string in my_list' è stata la prima cosa che ho provato, ma non è riuscito a trovare una stringa che era presente. Ho concluso che stava facendo un confronto tra oggetti piuttosto che un confronto di valori, che è quello di cui ho bisogno. Controllerò di nuovo. – Ari

+0

@Ari: No, confronta il valore. Non so cosa sia andato storto nel tuo caso. –

+0

Sì, funziona. Credo di aver avuto qualche altro errore lì. – Ari

3

È "legale" ed è supportato espressamente. La regola generale è "((x)) è sempre uguale a (x)" (anche se (x) non è sempre uguale a x ovviamente) e viene applicato alle espressioni del generatore semplicemente per comodità.

+2

Giusto per chiarire, 'x' non è un segnaposto per qualsiasi cosa qui. 'f ((a, b))' è ovviamente diverso da 'f (a, b)'. –

+1

Sì, infatti, è un segnaposto per una singola espressione. –

+0

Puoi fornire un riferimento per questa regola (che ((x)) è sempre uguale a (x))? – Ari