list는 _순서_를 가진 변경 가능한 항목의 모음이에요. 대부분의 컬렉션(내장 타입인 tuple, dict, set을 참고해요)처럼, 배열은 다른 배열을 포함해 어떤 데이터 타입(또는 여러 타입)에 대한 참조도 담을 수 있어요. 배열은 슬라이스 표기법을 쓰거나 <list>.copy()를 통해 전체 또는 일부를 복사할 수 있어요. 다른 시퀀스 타입과 마찬가지로, lists 안의 원소는 왼쪽에서부터 0-based index 번호로, 오른쪽에서부터 -1-based index 번호로 참조해요.
배열은 min(<list>)/max(<list>), <list>.index(), <list>.append(), <list>.reverse() 같은 일반 시퀀스 연산과 변경 가능 시퀀스 연산을 모두 지원해요. list 안의 원소는 for item in <list> 구문으로 반복할 수 있어요. 원소의 인덱스와 값이 둘 다 필요할 때는 for index, item in enumerate(<list>)를 사용할 수 있어요.
Python은 배열을 다룰 때 쓸모 있는 배열 메서드도 많이 제공해요. 그중 일부 list methods는 아래에서 다뤄요.
list-method로 list를 조작하면 전달된 배열 객체를 변경한다는 점에 주의해야 해요. 원본 list를 변경하고 싶지 않다면, 슬라이스나 <list>.copy()를 통해 최소한 shallow copy를 만들어야 해요.
기존 배열의 끝, 즉 "오른쪽"에 항목을 추가하려면 <list>.append(<item>)를 사용해요:
>>> numbers = [1, 2, 3]
>>> numbers.append(9)
>>> numbers
[1, 2, 3, 9]
덧붙이는 대신, <list>.insert()를 사용하면 배열의 _특정 인덱스_에 항목을 추가할 수 있어요. 매개변수를 두 개 받아요:
<index>
<item>
참고: 주어진 index가 0이면 항목은 list의 맨 앞("왼쪽")에 추가돼요. 지정한 index가 list의 마지막 index보다 크면, 항목은 맨 끝에 추가돼요. <list>.append(<item>)를 사용한 것과 같아요.
>>> numbers = [1, 2, 3]
>>> numbers.insert(0, -2)
>>> numbers
[-2, 1, 2, 3]
>>> numbers.insert(1, 0)
>>> numbers
[-2, 0, 1, 2, 3]
<list>.extend(<item>)는 기존 배열을 다른 이터러블(예를 들어 set, tuple, str, list)의 원소와 합치는 데 사용할 수 있어요. 이터러블은 풀어헤쳐지고 원소가 순서대로 덧붙여져요. (이 경우 <list>.append(<item>)를 사용하면 이터러블 전체가 하나의 항목으로 추가돼요.)
>>> numbers = [1, 2, 3]
>>> other_numbers = [5, 6, 7]
>>> numbers.extend(other_numbers)
>>> numbers
[1, 2, 3, 5, 6, 7]
>>> numbers.extend([8, 9])
>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9]
>>> numbers.append([8,9])
>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9, [8, 9]]
배열에서 항목을 삭제하려면 <list>.remove(<item>)를 사용하고, 제거할 항목을 인자로 전달해요. <list>.remove(<item>)는 항목이 list에 없으면 ValueError를 발생시켜요.
>>> numbers = [1, 2, 3]
>>> numbers.remove(2)
>>> numbers
[1, 3]
# Trying to remove a value that is not in the list throws a ValueError
>>> numbers.remove(0)
ValueError: list.remove(x): x not in list
또는 <list>.pop(<index>) 메서드를 사용하면 원소를 제거하고 사용할 수 있게 return해요.
<list>.pop(<index>)는 선택적 매개변수 하나를 받아요. 제거하고 반환할 항목의 index예요. (선택적인) index 인자를 지정하지 않으면 list의 마지막 원소가 제거되어 반환돼요. 지정한 index가 마지막 항목의 index보다 크면 IndexError가 발생해요.
>>> numbers = [1, 2, 3]
>>> numbers.pop(0)
1
>>> numbers
[2, 3]
>>> numbers.pop()
3
>>> numbers
[2]
>>> numbers.pop(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range
list.clear()를 사용하면 list의 모든 원소를 제거할 수 있어요. 매개변수를 받지 않아요.
>>> numbers = [1, 2, 3]
>>> numbers.clear()
>>> numbers
[]
<list>.reverse() 메서드는 원소의 순서를 제자리에서 뒤집어요.
>>> numbers = [1, 2, 3]
>>> numbers.reverse()
>>> numbers
[3, 2, 1]
배열은 <list>.sort()를 사용해 제자리에서 순서를 바꿀 수 있어요. 기본 정렬 순서는 왼쪽에서부터 _오름차순_이에요. Python 문서에서는 정렬에 관한 추가 팁과 기법을 제공해요.
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
# The default sort order is *ascending*.
>>> names.sort()
>>> names
["Bruce", "Natasha", "Thor", "Tony"]
_내림차순_으로 정렬하고 싶다면 reverse=True 인자를 전달해요:
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> names.sort(reverse=True)
>>> names
["Tony", "Thor", "Natasha", "Bruce"]
원본 배열을 변경하고 싶지 않은 경우에는 내장 함수 sorted(<iterable>)를 사용해 정렬된 복사본을 반환할 수 있어요.
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> sorted(names)
['Bruce', 'Natasha', 'Thor', 'Tony']
배열에서 원소가 나타나는 횟수는 list.count(<item>)로 계산할 수 있어요. 셀 item을 인자로 받아, 그 원소가 list에 나타나는 총 횟수를 반환해요.
>>> items = [1, 4, 7, 8, 2, 9, 2, 1, 1, 0, 4, 3]
>>> items.count(1)
3
<list>.index(<item>)는 전달한 항목이 처음 나타나는 위치의 index 번호를 반환해요. 나타나는 곳이 없으면 ValueError가 발생해요. 항목의 정확한 위치가 필요하지 않다면, 내장 in 연산자가 배열에 특정 값이 있는지 확인하는 데 더 효율적이에요.
인덱싱은 왼쪽에서부터 0부터 시작하므로, "첫 번째" 항목의 위치는 0이에요. 인덱싱은 오른쪽에서도 동작하며 -1부터 시작해요.
>>> items = [7, 4, 1, 0, 2, 5]
>>> items.index(4)
1
>>> items.index(10)
ValueError: 10 is not in list
start와 end 인덱스를 제공해 list의 특정 구간으로 검색 범위를 좁힐 수도 있어요:
>>> names = ["Tina", "Leo", "Thomas", "Tina", "Emily", "Justin"]
>>> names.index("Tina")
0
>>> names.index("Tina", 2, 5)
3
Chaitana는 아주 인기 있는 테마파크를 운영해요. 잘 가꾸어진 정원 한가운데에는 단 하나의 놀이기구만 있어요. 바로 세계에서 가장 큰 롤러코스터(TM)예요. 이 하나뿐인 놀이기구인데도, 사람들은 전 세계에서 몰려와 Chaitana의 하이퍼코스터를 타기 위해 몇 시간씩 줄을 서요.
이 놀이기구에는 두 개의 줄이 있고, 각각은 list로 표현돼요.
테마파크 손님들을 더 잘 관리할 수 있도록 코드를 작성해 달라는 부탁을 받았어요. 손님들과 사장님인 Chaitana가 짜증 내기 전에, 최대한 빨리 다음 함수들을 구현해야 해요. 꼼꼼히 읽어 봐요. 어떤 과제는 기존 줄을 바꾸거나 갱신하라고 하고, 또 어떤 과제는 그것을 복사하라고 해요.
add_me_to_the_queue() 함수를 정의해요. 이 함수는 <express_queue>, <normal_queue>, <ticket_type>, <person_name> 4개의 매개변수를 받고, 해당하는 줄에 그 사람의 이름을 추가해서 반환해요.
<ticket_type>은 int이고, 1 == express_queue, 0 == normal_queue예요.<person_name>은 각각의 줄에 추가할 사람의 이름(str)이에요.>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=1, person_name="RichieRich")
...
["Tony", "Bruce", "RichieRich"]
>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=0, person_name="HawkEye")
....
["RobotGuy", "WW", "HawkEye"]
한 사람이 공원에 늦게 도착했지만, 친구들이 기다리고 있는 줄에 합류하고 싶어 해요. 그런데 친구들이 어디에 서 있는지 전혀 모르고, 전화를 걸 휴대폰 신호도 터지지 않아요.
find_my_friend() 함수를 정의해요. 이 함수는 queue와 friend_name 2개의 매개변수를 받고, 그 사람의 이름이 줄에서 몇 번째에 있는지 반환해요.
<queue>는 줄에 서 있는 사람들의 list예요.<friend_name>은 인덱스(줄에서의 위치)를 찾아야 하는 친구의 이름이에요.기억해요. 인덱스는 왼쪽에서 0부터 시작하고, 오른쪽에서 -1부터 시작해요.
>>> find_my_friend(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], friend_name="Steve")
...
1
이제 (위의 2번 과제에서) 친구들을 찾았으니, 늦게 도착한 사람은 친구들이 있는 줄의 자리에 합류하고 싶어 해요.
add_me_with_my_friends() 함수를 정의해요. 이 함수는 queue, index, person_name 3개의 매개변수를 받아요.
<queue>는 줄에 서 있는 사람들의 list예요.<index>는 새로 온 사람을 추가할 위치예요.<person_name>은 그 위치에 추가할 사람의 이름이에요.늦게 도착한 사람의 이름이 추가된 줄을 반환해요.
>>> add_me_with_my_friends(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], index=1, person_name="Bucky")
...
["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]
방금 줄에서 어떤 아주 못된 사람이 밀치고 소리치고 문제를 일으키고 있다는 이야기를 들었어요. 그 못된 사람을 잘못된 행동 때문에 쫓아내야 해요!
remove_the_mean_person() 함수를 정의해요. 이 함수는 queue와 person_name 2개의 매개변수를 받아요.
<queue>는 줄에 서 있는 사람들의 list예요.<person_name>은 쫓아내야 하는 사람의 이름이에요.못된 사람의 이름이 빠진 줄을 반환해요.
>>> remove_the_mean_person(queue=["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], person_name="Eltran")
...
["Natasha", "Steve", "Wanda", "Rocket"]
똑같이 생긴 남남인 두 사람을 본 적은 없더라도, 이름이 똑같은 남남인 사람들은 분명히 본 적이 있을 거예요(이름이 같은 사람들)! 오늘은 그런 사람이 잔뜩 온 것 같아요. 특정 이름이 줄에 몇 번 나오는지 알고 싶어요.
how_many_namefellows() 함수를 정의해요. 이 함수는 queue와 person_name 2개의 매개변수를 받아요.
<queue>는 줄에 서 있는 사람들의 list예요.<person_name>은 줄에 한 번 이상 나올 것 같은 이름이에요.person_name이 나오는 횟수를 int로 반환해요.
>>> how_many_namefellows(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"], person_name="Natasha")
...
2
안타깝게도 오늘은 공원이 너무 붐벼서 일반 줄의 마지막 사람을 내보내야 해요(그 사람에게는 다른 날 익스프레스 줄로 다시 올 수 있는 교환권을 줄 거예요).
줄에 서 있는 사람들의 목록인 queue 1개의 매개변수를 받는 remove_the_last_person() 함수를 정의해야 해요.
list를 갱신하고, 내보낸 사람의 이름도 return해서 그 사람에게 교환권을 써 줄 수 있게 해야 해요.
>>> remove_the_last_person(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
'Rocket'
관리 목적으로, 주어진 줄에 있는 모든 이름을 알파벳순으로 정렬해야 해요.
sorted_names() 함수를 정의해요. 이 함수는 1개의 인자 queue(줄에 서 있는 사람들의 list)를 받고, list의 sorted된 복사본을 반환해요.
>>> sorted_names(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.