Fusionar elementos de la lista según la condición dentro de la lista

Tengo una lista de artículos: por ejemplo:

a = ['IP 123 84', 'apple', 'mercury', 'IP 543 65', 'killer', 'parser', 'goat', 'IP 549 54 pineapple', 'django', 'python'] 

Quiero fusionar los elementos de la lista en función de la condición, es decir, fusionar todos los elementos hasta el elemento que comienza con IP. La salida que quiero es:

 a = ['IP 123 84 apple mercury', 'IP 543 65 killer parser goat', 'IP 549 54 pineapple django python'] 

Por favor sugiera cómo hacerlo.

Utilizando un generador.

 def merge(x, key='IP'): tmp = [] for i in x: if (i[0:len(key)] == key) and len(tmp): yield ' '.join(tmp) tmp = [] tmp.append(i) if len(tmp): yield ' '.join(tmp) a = ['IP 123 84','apple','mercury','IP 543 65','killer','parser','goat','IP 549 54 pineapple','django','python'] print list(merge(a)) ['IP 123 84 apple mercury', 'IP 543 65 killer parser goat', 'IP 549 54 pineapple django python'] 

Una forma divertida de hacerlo:

 import itertools def predicate_grouper(li, predicate='IP'): indices = [i for i,x in enumerate(a) if x.startswith(predicate)] slices = [slice(*x) for x in itertools.zip_longest(indices,indices[1:])] for sli in slices: yield ' '.join(li[sli]) 

manifestación:

 list(predicate_grouper(a)) Out[61]: ['IP 123 84 apple mercury', 'IP 543 65 killer parser goat', 'IP 549 54 pineapple django python'] 

Si la cadena ‘IP’ solo existe al principio de algunos elementos de a , únase a la lista y luego divídala:

 In [99]: ['IP'+i for i in ''.join(a).split('IP')[1:]] Out[99]: ['IP 123 84applemercury', 'IP 543 65killerparsergoat', 'IP 549 54 pineappledjangopython'] 

Si a es como

 a = ['IP 123 84', 'apple', 'mercury', 'IP 543 65', 'killer', 'parserIP', 'goat', 'IP 549 54 pineapple', 'django', 'python'] ^^^^ 

la solución anterior no funcionará, puede insertar una secuencia especial (que nunca debe aparecer en a) en a, y luego unirse y dividirla:

 In [11]: for i, v in enumerate(a): ...: if v.startswith('IP'): ...: a[i]='$$$'+v ...: ''.join(a).split('$$$')[1:] Out[11]: ['IP 123 84applemercury', 'IP 543 65killerparsergoat', 'IP 549 54 pineappledjangopython'] 
 import re def group_IP_list(lst): groups = [] word_group = [] for list_item in lst: if re.search(r'^IP',list_item) and word_group: groups.append(' '.join(word_group)) elif re.search(r'^IP',list_item): word_group = [list_item] else: word_group.extend([list_item]) groups.append(' '.join(word_group)) return groups #Usage: a = ['IP 123 84','apple','mercury','IP 543 65','killer','parser','goat','IP 549 54 pineapple','django','python'] print group_IP_list(a) #Result: ['IP 123 84 apple mercury', 'IP 123 84 apple mercury killer parser goat', 'IP 123 84 apple mercury killer parser goat django python']