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++'']