Można użyć wyrażenia regularnego do osiągnięcia tego zwięźle. To jednak trochę obchodzi twoje pytanie dotyczące sposobu działania na elementach listy zależnej. Kredyty na numer mbomb007 w celu ulepszenia dozwolonej funkcjonalności postaci.
import re
z = re.findall('\*[^*]+',"".join(x))
Wyjścia:
['*abc', '*de', '*f', '*g']
Mały benchmarking:
Donkey Kong's answer:
import timeit
setup = '''
import re
x = ['*a', 'b', 'c', '*d', 'e', '*f', '*g']
y = ['*a', 'b', 'c', '*d', 'e', '*f', '*g'] * 100
'''
print (min(timeit.Timer('re.findall("\*[^\*]+","".join(x))', setup=setup).repeat(7, 1000)))
print (min(timeit.Timer('re.findall("\*[^\*]+","".join(y))', setup=setup).repeat(7, 1000)))
Zwraca odpowiednio 0.00226416693456
i 0.06827958075
.
Chepner's answer:
setup = '''
x = ['*a', 'b', 'c', '*d', 'e', '*f', '*g']
y = ['*a', 'b', 'c', '*d', 'e', '*f', '*g'] * 100
def chepner(x):
partials = []
for element in x:
if element.startswith('*'):
partials.append([])
partials[-1].append(element)
concat = map("".join, partials)
return concat
'''
print (min(timeit.Timer('chepner(x)', setup=setup).repeat(7, 1000)))
print (min(timeit.Timer('chepner(y)', setup=setup).repeat(7, 1000)))
Zwraca 0.00456210269896
i 0.364635824689
odpowiednio.
Saksham's answer
setup = '''
x = ['*a', 'b', 'c', '*d', 'e', '*f', '*g']
y = ['*a', 'b', 'c', '*d', 'e', '*f', '*g'] * 100
'''
print (min(timeit.Timer("['*'+item for item in ''.join(x).split('*') if item]", setup=setup).repeat(7, 1000)))
print (min(timeit.Timer("['*'+item for item in ''.join(y).split('*') if item]", setup=setup).repeat(7, 1000))))
Zwraca 0.00104848906006
i 0.0556093171512
odpowiednio.
tl; dr Saksham's jest nieco szybszy niż mój, po czym Chepner śledzi oba nasze.
Lovely. +1 za przywrócenie dyskusji do "* pythonic *" iz dala od zgrabnego/kompaktowego/szybkiego. – LondonRob
Dodano twoją odpowiedź na mój mały benchmark, jeśli jesteś zainteresowany :) – miradulo
Mój wolny czas na dużym wejściu mnie nie zaskakuje :) Jednakże, jeśli 'x' byłby naprawdę tak duży, spoglądałbym na budowanie' concat 'jak buduję' x', zamiast czekać, aż 'x' się zakończy. – chepner