다음과 같은 입력이 있습니다.
['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++']
이것은 어느 정도 작동하지만 전체 목록에 대해이 명령을 반복하는 방법을 모르겠습니다.
답변
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++']
