Q. 공통된 시작 단어(prefix)를 반환해주세요.
def get_prefix(strs) :
result = ''
if strs :
for count in range(len(strs[0])) :
list = [word[count] for word in strs]
if len(set(list)) == 1 :
result += list[0]
else :
break
return result
set()
을 이용해서 중복을 제거def get_prefix(strs):
result = ''
for i in zip(*strs) :
print(i)
if len(set(i)) == 1 :
result = result + i[0]
else :
break
return result
진수님이 알려준 내장함수 zip()
을 사용한 코드.
원리는 1차에 내가 작성한 코드와 같지만 확실히 가독성이 좋고 간결하다.
새로운 함수를 알았다 !
zip()
returns a zip object, which is an iterator of tuples where the first item in each passed iterator is paired together, and then the second item in each passed iterator are paired together etc.
각 인수(iterator)의 첫번째 요소들을 한 튜플로 묶고 두번째 요소들을 한 튜플로 묶고 . . (반복) 의 작업을 해주는 함수다.
list1 = ['a', 'b', 'c']
list2 = [1, 2, 3]
list3 = ['C', 'B', 'A']
x = zip(list1, list2, list3)
#zip형식으로 반환하기 때문에 읽을 수 있는 리스트형식으로 바꿔준다.
print(list(x))
#1
[('a', 1, 'C'), ('b', 2, 'B'), ('c', 3, 'A')]
print(list(list1))
#2
[('a',), ('b',), ('c',)]
(#1
) zip 의 인수로 들어온 iterator 들을 세로로 묶는다.
(#2
) 인수가 하나만 들어오면 빈 iterator과 세로로 묶여서 ('a',)
와 같이 공백과 한 튜플로 묶인다.
str = [ 'start', 'stair', 'step' ] 을
str1 = ['s','t','a','r','t']
str2 = ['s','t','a','i','r']
str3 = ['s','t','e','p'] 의 형태로 바꿔
zip(str1, str2, str3) 을 하면 원하는 결과가 나올 것이다.
#[('s', 's', 's'), ('t', 't', 't'), ('a', 'a', 'e'), ('r', 'i', 'p')]
2차 코드와 같이 zip 인수에 *
을 붙여서 args로 바꿔주면 리스트 안의 요소를 각각의 인수로 인식한다.
💙 파이썬 공부할 때 정리해둔 글 💙 -> Function Parameter : args?
str = [ 'start', 'stair', 'step' ]
print(*str)
#start step stair
print(*str)
은 print('start', 'stair', 'step')
과 같다.
zip(*str)
은 zip('start', 'stair', 'step')
과 같다.
for
을 사용해서 zip의 반환값을 하나씩 불러온 후 set
함수 적용은 1차코드와 동일하다.
1 ('s', 's', 's')
2 ('t', 't', 't')
3 ('a', 'a', 'e')
4 ('r', 'i', 'p')
단어의 길이가 다르기 때문에 생기는 뒤에 남는 문자들은 자동으로 무시한다.