[python] 해당 요소가 두 공백 사이에있는 경우 목록 요소 결합

다음과 같은 입력이 있습니다.

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

다음 ''과 같은 출력을 갖도록 요소를 결합하고 싶습니다 .

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

다음 join과 같이 슬라이싱을 사용 하고 나열했습니다.

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

이것은 어느 정도 작동하지만 전체 목록에 대해이 명령을 반복하는 방법을 모르겠습니다.



답변

사용 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]

산출:

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


답변

이것은 끔찍하고 해 키지 만

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

목록의 연결에 포함되어 있지 않다고 보장 할 수있는 문자열을 취하고 원하는 것을 수행하는 함수를 반환합니다. 물론 특정 상황에서 한두 번만 사용하고 싶을 수 있으므로 목록의 요소에 공백이없는 것을 보장 할 수 있으면 다음과 같이 보일 수 있습니다.

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


답변

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 = ""


답변

당신은 이것을 할 수 있습니다 :

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

산출:

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

주석 후 편집 :

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

산출:

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


답변

입력 분리 문자가 실제로 빈 문자열이면 다음을 수행 할 수 있습니다.

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


답변

꽤 오래되었지만 여전히 유용합니다.

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)

이 결과

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


답변

루프
내부 의 목록에 대해 루프를 실행 하여 요소를 임시 빈 문자열에 추가하고 요소가 빈 문자열인지 또는 목록의 마지막 요소인지 여부를 확인하십시오. true 인 경우 임시 변수를 출력 목록에 추가하고 값을 변경하십시오. 빈 문자열에 해당 변수의
코드 :

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)

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