C'è un sacco di risposte qui :)
Le due migliori risposte (prestazioni e codice pulito in una sola riga) sono le risposte di @icecrime e @Hoopdady
Entrambi asnwers risultati altrettanto, l'unica differenza è la prestazione.
cases = [
(None, 'testB'),
('', 'testB'),
('testA', 'testB'),
('testA', ''),
('testA', None),
(None, None)
]
for case in cases: print '-'.join(filter(bool, case))
'testB'
'testB'
'testA-testB'
'testA'
'testA'
for case in cases: print '-'.join([x for x in case if x])
'testB'
'testB'
'testA-testB'
'testA'
'testA'
Allora, facciamo un punto di riferimento :)
import timeit
setup = '''
cases = [
(None, "testB"),
("", "testB"),
("testA","testB"),
("testA", ""),
("testA", None),
(None, None)
]
'''
print min(timeit.Timer(
"for case in cases: '-'.join([x for x in case if x])", setup=setup
).repeat(5, 1000))
0.00171494483948
print min(timeit.Timer(
"for case in cases: '-'.join(filter(bool, case))", setup=setup
).repeat(5, 1000))
0.00283288955688
Ma, come ha detto @mgilson, utilizzando None
anziché bool
come funzione nella filter
produce lo stesso risultato e hanno una performance molto migliore:
print min(timeit.Timer(
"for case in cases: '-'.join(filter(None, case))", setup=setup
).repeat(5, 1000))
0.00154685974121
Quindi, il miglior risultato è la risposta dato dal @icecrime con il suggerimento di @mgilson:
012.351.
'-'.join(filter(None, (a,b)))
La differenza di prestazioni è in millisecondi per 1000 iterazioni (microsecondi per iterazione). Quindi questi due metodi hanno prestazioni alquanto simili e, per quasi tutti i progetti, è possibile sceglierne uno qualsiasi; Nel caso in cui il progetto deve avere una migliore performance, considerando microsecondi, si potrebbe seguire questo benchmark :)
Cosa vuoi se sono entrambi nulli? – unholysampler
Ok, questo lo so. Ma ci sono molti modi per farlo (come puoi vedere nelle risposte qui sotto). –
What downvotefest (su Q e A) per una domanda piuttosto semplice:/ – Junuxx