기록하는삶

[파이썬/python] 리스트(List), 리스트 복사, 리스트 메서드 본문

AI/파이썬(Python)

[파이썬/python] 리스트(List), 리스트 복사, 리스트 메서드

mingchin 2021. 9. 22. 00:54
728x90
반응형

1) 리스트 정의하기( 변수명 = [항목1, 항목2, 항목3, ...] )

데이터를 묶어서 처리하는 방법 중 하나인 리스트(list). 데이터 타입 기호로는 []를 사용하고, 항목은 ,로 구분한다. [] 안에 아무것도 입력하지 않으면 빈 리스트를 만들 수 있고, 나중에 항목을 추가할 수도 있다. 항목으로는 정수(integer), 실수(float), 문자형(string), 튜플(tuple), 집합(set), 리스트(list) 등의 데이터 타입이 들어갈 수 있으며 각 항목들은 서로 데이터 타입이 같지 않아도 된다.

2) 인덱스( 리스트명[인덱스] )

리스트가 정의될 때 항목이 나열된 순서에 따라 인덱스(index)가 부여된다. 이때 첫 번째 항목의 인덱스가 1이 아니라 0임에 유의하자. (이상하게 느껴질 수 있지만 개수를 생각할 때 편의를 위함인 듯 하다. 다른 기능들이 보다 자연스러워질 수 있다.) 특정 인덱스의 항목을 불러오고 싶은 경우, 다음과 같이 해볼 수 있다.

특정 항목의 인덱스를 '인덱스 = 앞에 있는 항목의 수'라 생각하면 편하다. list1에서 5의 경우 앞에 있는 숫자의 개수(4)가 자신의 인덱스이다. '리스트명[인덱스]'를 통해 해당 리스트에서 특정 인덱스의 항목을 불러올 수 있다.

'리스트명[-n]'을 통해 뒤에서 n번째 항목을 불러올 수도 있다.

불러오는 항목이 리스트(list5의 마지막 항목, 즉 [1,2,3])이므로 그 리스트의 특정 항목을 불러오는 것도 가능하다.

3) 연산( +: 이어붙이기, *n: n번 반복하기 )

두 리스트를 더하면 순서대로 이어 붙인다. 당연히 일반적으로 (list1 + list2)와 (list2 + list1)은 다르다.

'리스트명*n'을 통해 해당 리스트를 반복해서 이어붙일 수 있다.

4) 슬라이싱( 리스트명[a:b] )

인덱스를 활용해 리스트의 일부분만 불러올 수도 있다. 이를 슬라이싱(slicing)이라 부른다.

'리스트명[a:b]'를 입력하면, a를 인덱스로 갖는 항목부터 b를 인덱스로 갖는 항목 바로 이전 항목까지를 가져온다. 마지막 항목이 포함되지 않음에 유의하자. 총 (b-a)개의 항목이 결과로 나온다고 생각하면 된다. 또한 a가 생략되면 처음부터, b가 생략되면 끝까지 슬라이싱한다.

아래와 같이 일부만 가져오는 것도 가능하며,

특정 범위에서, 특정 간격(step)으로 항목을 불러오는 것도 가능하다. (리스트명[a:b:c], c가 step을 의미)

5) 항목 삭제 및 존재 확인( del 리스트명[i] / x in 리스트명 )

특정 인덱스의 항목을 삭제하거나, 특정 항목이 리스트 안에 있는지 여부를 bool type(T/F)으로 확인할 수 있다.

'del 리스트명[인덱스]'를 통해 해당 인덱스의 항목을 삭제할 수 있다. 두 번째 줄의 경우 이미 위에서 list1의 항목이 변경된 후에 적용되므로, 변화된 list1의 마지막 항목 9를 삭제하여 [1,2,3,4,5,6,7,8]이 되었다.

9와 10은 더이상 list1안에 있지 않아 False를 반환하고, True는 하나의 항목으로 list4안에 존재하므로 True를 반환했다. [1,2,3]이라는 리스트 역시 list5안에 항목으로 존재한다.

 

6) 리스트 복사

특정 리스트를 그대로 복사하되, 서로 다른 메모리 주소를 할당하여 별도의 객체로 생성하고 싶은 경우 아래의 방법들을 사용할 수 있다.

 

① 슬라이싱 활용

이 방법은 1차원 배열에서만 적용되며, 2차원 이상의 배열에 대해서는 원하는대로 기능하지 않음에 주의하자.

② 빈 리스트에 더하며 할당

③ list.copy() 활용

④ list() 함수 활용

 

7) 리스트 메서드(list method _ 리스트명.메서드명())

리스트에만 적용 가능한 일종의 함수들이 있다. 리스트를 변경, 정렬하거나 리스트와 관련된 특정 정보를 반환해준다. '리스트명.메서드명()'의 형태로 입력해야 하고, 어떤 메서드냐에 따라 괄호 안에 입력해야 하는 형식도 달라질 수 있다.

① append(항목): 항목 하나를 맨 마지막에 추가

맨 마지막에 추가하는 것에 유의하자.

② insert(인덱스, 항목): 특정 위치에 항목을 삽입

리스트에서 '인덱스 = 앞에 있는 항목의 개수'라 했으므로, 첫 번째 명령의 의미는 인덱스 3에 -1을 삽입해라, 즉 '앞에 3개의 항목을 두고 -1을 입력해라'가 된다. 마찬가지로 아래는 '앞에 9개의 항목을 두도록 -10을 삽입해라'가 된다.

③ extend(iterable한 무언가): 항목 여러 개를 맨 마지막에 추가

이런 식으로 리스트 뒤 쪽에 iterable한 것을 이어 붙일 수 있다. 리스트(list), 튜플(tuple), 사전형(dictionary) 등과 range함수의 경과 등이 iterable한 형식의 예인데, 이에 대해서는 나중에 다루도록 하자. list 뒤에 또 다른 덩어리를 이어 붙인다고 생각해도 무방하다.

④ remove(항목): 입력된 항목과 첫번째로 일치하는 항목을 삭제

설명을 위해 list1에 '길동'을 하나 추가한 뒤, remove를 이용해보았다. 앞에 있는 길동이 먼저 사라진다. 한 번 더 실행했더니 뒤에 있는 길동도 사라졌다. 앞에서부터 순차적으로 하나씩 삭제하는 메서드이다.

⑤ pop(인덱스): 특정 항목을 리스트에서 제거하고, 해당 항목을 반환

인덱스의 default값이 -1로, 결과로는 마지막에 위치해있던 '항목'이 튀어나오고, 해당 항목은 리스트에서는 사라진다. 인덱스 위치에 다른 값을 집어넣으면 해당 인덱스의 항목을 리스트에서 제거하고, 그 항목을 결과로 반환한다.

⑥ index(항목): 리스트에서 입력한 항목과 처음으로 일치하는 인덱스 반환

-1 항목을 두 개 추가한 뒤 index를 적용해보았다. -1은 3개 존재하지만, 가장 먼저 있는 항목의 index인 3을 출력한다. 즉, -1은 앞에 3개의 항목을 두고 4번째에 처음 나온다.

⑦ count(항목): 해당 항목이 리스트 안에 몇 개 있는지 반환

없는 항목을 넣으면 0이 나온다.

⑧ sort(): 숫자 혹은 문자열 항목들을 순서대로(역순으로) 정렬한다.

숫자는 크기 순으로, 문자는 가나다 (혹은 a,b,c) 순 등으로 정렬해준다.

이때 사실 sort()의 괄호 안에는 'reverse = False'가 디폴트 값으로 생략된 것이므로, 'reverse = True'를 입력하면 역순으로 정렬도 가능하다. 이어 나오는 reverse()와 헷갈리지 말자. 추가로 비슷한 sorted라는 함수도 있는데 아래에서 살펴보자.

문자형 데이터를 항목으로 가진 리스트의 경우 sort()의 괄호 안에 'key=len'의 조건을 추가해 길이 순으로 나열하는 것도 가능하다. 이때 길이가 같은 항목이 존재하는 경우, 원래 리스트에 있던 순서를 그대로 유지한다.

⑨ reverse(): 리스트를 현재 순서의 역순으로 정렬

현재 순서의 반대로 나열한다. 위에 언급한 sort(reverse = True)와 다름을 알 수 있다.

⑩ 리스트 정렬과 관련된 다른 함수

> sorted(리스트명): 리스트를 크기 순으로 나열해 출력하지만, 원래 리스트는 보존

위의 sort()를 이용하면, 원래 리스트가 가지고 있던 순서는 사라진다. 원래 리스트를 보존하면서 순서대로 나열한 것을 보고 싶은 경우 위와 같이 새롭게 리스트를 형성하거나, 아니면 sorted(리스트명)을 통해 일시적으로 확인해 볼 수 있다. 물론 역순도 가능. 다만 함수이기 때문에 '리스트명.sorted()'의 형식이 아니라 리스트를 함수에 집어 넣어야 한다. 같은 기능을 할 수 있는 reversed()도 있다.(역순으로 나열, 원래 리스트 보존)

> bisect

'import bisect as bi'를 통해 외부 library를 불러와 활용해볼 수 있다.

bi.bisect(리스트명, 항목): 리스트에 해당 항목을 넣을 때, 어느 index에 넣어야 원래의 배열(정배열)을 유지하는지 보여준다.

100이라는 항목을 list99에 추가하려면 index가 9인 위치(앞에 9개의 항목을 두고)에 삽입하면 원래의 배열을 해치지 않는다.

bi.insort(리스트명, 항목): 리스트의 정렬(정배열)을 유지하면서 해당 항목을 삽입

원래 리스트가 배열이 정리되지 않은 경우, 의미가 없어질 수 있다. 이때 리스트명.reverse의 경우 본래의 list를 역방향으로 수정하는 것으로, 이를 한 번에 또 다른 변수로 설정하면 오류가 날 수 있음에 유의해야한다.

728x90
반응형