python - Unir elementos de uma lista se esses elementos estiverem entre dois espaços em branco




join slice (5)

Bastante antigo, mas ainda ú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)

Isso gera

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

Eu tenho uma entrada como esta:

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

Quero juntar elementos entre '' para ter uma saída como esta:

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

Eu tentei usar join e listar fatias como esta:

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

Isso funciona até certo ponto, mas não sei como iterar essa instrução para a lista inteira.


Isso é horrível e hacky, mas

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

pode pegar qualquer string que você possa garantir que não esteja contida na concatenação da lista e retornar uma função fazendo o que você deseja. Obviamente, você provavelmente deseja usá-lo apenas uma ou duas vezes para sua situação específica; portanto, se você puder garantir que nenhum elemento da lista contenha um espaço, pode parecer mais com:

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

Se você não pode ou não deseja usar as ferramentas:

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]

Resultado:

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

executar um loop sobre a lista
dentro do loop, adicione o elemento a uma string vazia temporária e verifique a condição de se o elemento é uma string vazia ou o último elemento da lista, se true, adicione a variável temporária à lista de saída e altere o valor dessa variável para uma vazia corda
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)

Saída: ['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']





whitespace