python list join slice whitespace

python - Unir elementos de una lista si esos elementos están entre dos espacios en blanco



join slice (7)

Tengo una entrada como esta:

[''assembly'', '''', ''py'', ''tho'', ''n'', '''', ''ja'', ''va'', '''', ''rub'', ''y'', '''', ''java'', ''script'', '''', ''c++'']

Quiero unir elementos entre '''' para tener una salida como esta:

[''assembly'', ''python'', ''java'', ''ruby'', ''javascript'', ''c++'']

Intenté usar join y dividir listas de esta manera:

a=[''assembly'', '''', ''py'', ''tho'', ''n'', '''', ''ja'', ''va'', '''', ''rub'', ''y'', '''', ''java'', ''script'', '''', ''c++''] a[2:5] = [''''.join(a[ 2: 5])] a=[''assembly'', '''', ''python'', '''', ''ja'', ''va'', '''', ''rub'', ''y'', '''', ''java'', ''script'', '''', ''c++'']

Esto funciona hasta cierto punto, pero no sé cómo repetir esta instrucción para toda la lista.


Bastante viejo pero aún útil:

from itertools import groupby lst = [''assembly'', '''', ''py'', ''tho'', ''n'', '''', ''ja'', ''va'', '''', ''rub'', ''y'', '''', ''java'', ''script'', '''', ''c++''] new_lst = [''''.join(values) for key, values in groupby(lst, key = lambda x: x == '''') if not key] print(new_lst)

Esto produce

[''assembly'', ''python'', ''java'', ''ruby'', ''javascript'', ''c++'']


Esto es horrible y hacky, pero

lambda b:lambda l:''''.join(i or b for i in l).split(b)

puede tomar cualquier cadena que pueda garantizar que no esté contenida en la concatenación de la lista y devolver una función que haga lo que desee. Por supuesto, es probable que desee usar esto solo una o dos veces para su situación específica, por lo tanto, si puede garantizar que ningún elemento de la lista contenga un espacio, podría parecerse más a:

a = [''assembly'', '''', ''py'', ''tho'', ''n'', '''', ''ja'', ''va'', '''', ''rub'', ''y'', '''', ''java'', ''script'', '''', ''c++''] a = ''''.join(i or '' '' for i in a).split('' '')


Puedes hacerlo:

a = [''assembly'', '''', ''py'', ''tho'', ''n'', '''', ''ja'', ''va'', '''', ''rub'', ''y'', '''', ''java'', ''script'', '''', ''c++''] indx = ['''' == k for k in a] indx = [i for i, x in enumerate(indx) if x] # get the indices. a_merged = a[0:indx[0]] + [''''.join(a[indx[i]:indx[i+1]]) for i in range(len(indx)) if i < len(indx)-1] + a[indx[-1]+1:] # merge the list

Salida:

[''assembly'', ''python'', ''java'', ''ruby'', ''javascript'', ''c++'']

Editar después de los comentarios:

a = [''assembly'', '''','''', ''py'', ''tho'', ''n'', '''', ''ja'', ''va'', '''', ''rub'', ''y'', '''', ''java'', ''script'', '''', ''c++''] indx = [i for i, x in enumerate(a) if x == ''''] # get the indices where '''' occurs in the original list. a_merged = a[0:indx[0]] + [''''.join(a[indx[i]:indx[i+1]]) for i in range(len(indx)) if i < len(indx)-1 and indx[i+1] -indx[i] > 1] + a[indx[-1]+1:] a_merged

Salida:

[''assembly'', ''python'', ''java'', ''ruby'', ''javascript'', ''c++'']


Si los delimitadores de entrada son realmente cadenas vacías, entonces puede hacer

strlist = [x or '' '' for x in a] joined = ''''.join(strlist).split() joined [''assembly'', ''python'', ''java'', ''ruby'', ''javascript'', ''c++'']


Si no puede o no quiere usar itertools:

l = [''assembly'', '''', ''py'', ''tho'', ''n'', '''', ''ja'', ''va'', '''', ''rub'', ''y'', '''', ''java'', ''script'', '''', ''c++''] l_new = [] combined = "" for idx, s in enumerate(l): if s != "": combined += s if idx == len(l)-1: l_new.append(combined) else: l_new.append(combined) combined = ""


Usando itertools.groupby :

from itertools import groupby l = [''assembly'', '''', ''py'', ''tho'', ''n'', '''', ''ja'', ''va'', '''', ''rub'', ''y'', '''', ''java'', ''script'', '''', ''c++''] new_l = [''''.join(g) for k, g in groupby(l, key = bool) if k]

Salida:

[''assembly'', ''python'', ''java'', ''ruby'', ''javascript'', ''c++'']


ejecutar un ciclo sobre la lista
dentro del bucle agregue el elemento a una cadena vacía temporal y verifique la condición de si el elemento es una cadena vacía o el último elemento de la lista, si es verdadero, agregue la variable temporal a la lista de salida y cambie el valor de esa variable a un vacío cuerda
Código:

x=[''assembly'', '''', ''py'', ''tho'', ''n'', '''', ''ja'', ''va'', '''', ''rub'', ''y'', '''', ''java'', ''script'', '''', ''c++''] temp='''' output=[] for y in x: temp=temp+y if y=='''' or y==x[-1]: output.append(temp) temp='''' print(output)

Salida: [''assembly'', ''python'', ''java'', ''ruby'', ''javascript'', ''c++'']