Там много ответов здесь :)
Две лучшие ответы (производительность и чистый код в одной строке) являются ответы @icecrime и @Hoopdady
Оба asnwers результаты одинаково, с той лишь разницей это производительность.
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'
Так что давайте делать тест :)
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
Но, как сказал @mgilson, используя None
вместо bool
как функция filter
производит тот же результат и имеют достаточно большую производительность:
print min(timeit.Timer(
"for case in cases: '-'.join(filter(None, case))", setup=setup
).repeat(5, 1000))
0.00154685974121
Таким образом, лучший результат ответ дал на @icecrime с предложением от @mgilson:
'-'.join(filter(None, (a,b)))
Разница рабочих характеристик составляет миллисекунды на 1000 итераций (микросекунды на итерацию). Таким образом, эти два метода имеют совершенно равную производительность, и для практически любого проекта вы можете выбрать любой; В случае, если ваш проект должен иметь более высокую производительность, учитывая микросекунд, вы могли бы следовать этому бенчмарк :)
Что вам нужно, если они оба являются нулевыми? – unholysampler
Хорошо, это я знаю. Но есть много способов сделать это (как вы можете видеть в ответах ниже). –
Что такое downvotefest (как для Q, так и для A) для довольно простого вопроса:/ – Junuxx