2013-02-13 11 views
6

Vorrei un modo più divinatorio per il seguente ramo se del caso:Esiste un modo più elegante e pitonico di esprimere la seguente espressione condizionale?

if a<b: 
    a.append('value') 
elif a==b: 
    b.append('value') 
else: 
    do nothing 

Esiste un operatore ternario per questo?

+0

_Pythoniceans_ ** ** amore la parola _pythonic_, anche se non significa niente. –

+5

Cosa c'è di sbagliato nell'usare 6 linee? –

+1

Questo è probabilmente il modo migliore per farlo se i tre 'do sth's sono molto diversi. Se possono essere parametrizzati, il ramo potrebbe essere scritto in modo più conciso. Dicci di più sul tuo 'do sth's. – eumiro

risposta

4

Utilizzare un operatore ternario nidificato.

func1() if a<b else func2() if a==b else func3() 

Per esempio specifico:

a.append('value') if a<b else b.append('value') if a==b else None 
+7

ora mi hai messo nell'umore del golf '[func2, func3, func1] [cmp (a, b)]()' –

1

Si potrebbe fare qualcosa di simile:

result = a<b and first_action or a==b and second_action or third_action 

Dove * _action si inserisce il codice "fare sth" nella tua domanda

+0

Mentre 'e/o'-tricking funziona, lo rende molto meno leggibile. –

+0

@AttilaO. Penso che l'ingannare sia un aggettivo importante. La logica AND breve è comune nella maggior parte delle lingue ... E io sono un fan :) –

1

Your

if a<b: 
    a.append('value') 
elif a==b: 
    b.append('value') 
else: 
    do nothing 

non può essere molto riscritto, va bene così com'è. Forse basta rimuovere le ultime due righe (altrimenti/non fare nulla).

L'unica parametrizzazione che vedo qui è:

if a <= b: 
    (a,b)[a==b].append('value') 

ma che è semplicemente brutto.

+0

Questo non è corretto poiché curious

+1

@curious. Sì, e li ha considerati solo come diversi. Guarda la risposta ancora chiaramente. –

+0

@curious - è vero? Fa * qualsiasi cosa * solo se 'a <= b'. Quindi fa due cose diverse a seconda che sia 'a eumiro

0

Per la vostra esatto caso, uno di questi funzionerà:

[b, a, []][cmp(x, y)].append('value') 
[b, a, []][cmp(x, y)] += ['value'] 

Si prega di non fare questo. Il tuo codice attuale è facile da leggere.

+0

Ho iniziato una specie di competizione di golf? – Volatility

+1

@Volatility: lo spero – Blender

4

Ovviamente si può semplicemente lasciare il caso altrimenti off

if a<b: 
    a.append('value') 
elif a==b: 
    b.append('value') 
+0

Questo è l'unico miglioramento _real_. – georg

Problemi correlati