반응형
지난 시간에 이어 다른 객체들을 담을 수 있는 자료형중 리스트에 대해서 마저 알아보는 시간을 갖도록 하겠습니다.
파이썬 컨테이너 - 리스트
파이썬에서는 다른 객체들을 여러 개 담을 수 있는 자료형들도 제공합니다. 기본적으로는 리스트(list), 사전(dict), 집합(set), 튜플(tuple) 등이 제공됩니다. collections 모듈을 통해서 더 많은 종류의 컨테이너 자료형들을 사용할 수 있습니다.
기본 컨테이터 자료형들 정리
이름 | type | 예시 | 가변성 | 순서유지 | 중복허용 |
---|---|---|---|---|---|
리스트 | list | ["사과", 123, 3.14] |
가변 | O | O |
튜플 | tuple | ("사과", 123, 3.14) |
불변 | O | O |
집합 | set | {"사과", 123, 3.14} |
가변 | X | X |
사전 | dict | {"원주율":3.14, 123:"일이삼"} |
가변 | 3.6+ | 키X값O |
리스트 사용법 (List)
리스트는 파이썬에서 가장 유연하게 사용할 수 있고 많이 사용되는 컨테이너입니다.
리스트를 만드는 방법
리스트는 대괄호(square brackets [])으로 만들어지고 컴마(comma ,) 기호를 이용해서 아이템(item)을 구분합니다.
- 리스트의 가변성
- 기본적인 매소드
- 중첩리스트
- 리스트와 반목문(for) 에 대하여 알아보도록 하겠습니다.
기본적인 메써드
문자열은 변경을 하려면 새로운 객체를 만들어야 했습니다.
리스트는 가변 자료형이기 때문에 객체를 유지한 채로 내용을 바꿀 수 있어요.
In [1]:
my_list = [1, 2, 3]
print(id(my_list))
# append() 메써드를 이용하면 새로운 아이템을 추가할 수 있어요
my_list.append("새로운 아이템 추가!")
print(id(my_list))
my_list
# id가 변할까요? 아니죠 새로운 원소만 추가하는 경우 아이디가
# 변하지 않는다는 것을 앞에서 여러번 확인하였습니다.
1843657054848
1843657054848
Out[1]:
[1, 2, 3, '새로운 아이템 추가!']
In [2]:
print(type(my_list))
<class 'list'>
In [3]:
# 이렇게 하면 새로운 객체를 만들어줄까?
my_list = [1, 2, 3, 4]
print(id(my_list), my_list)
new_list = my_list.append("새로운 아이템 추가!")
print(id(new_list), new_list)
print(type(my_list))
print(type(new_list))
1843657070656 [1, 2, 3, 4]
140704014310616 None
<class 'list'>
<class 'NoneType'>
In [4]:
new_list
# 실행의 결과 아무것도 생성되지 않는 것을 확인할 수 있습니다.
# 즉 append 매소드는 새로운 객체를 생성하지 않습니다.
In [5]:
# pop() 메써드를 사용하면 원하는 위치에서 아이템 하나를 가져오면서 삭제합니다.
my_list = [1, 2, 3]
p = my_list.pop(0)
p
Out[5]:
1
반응형
- pop매소드를 사용하는 경우 리스트의 원소를 가져옵니다.
- 리스트의 원소의 속성을 그대로 가져오는 것을 타입을 통해 확인할 수 있습니다.
In [6]:
print(type(p))
<class 'int'>
In [7]:
my_list = [1, 2, "수학코딩"]
p = my_list.pop(2)
p
Out[7]:
'수학코딩'
In [8]:
print(type(p))
<class 'str'>
In [9]:
# pop() 메써드를 사용하면 원하는 위치에서 아이템 하나를 가져오면서 삭제합니다.
my_list = [1, 2, 3]
p = my_list.pop(0)
print(id(my_list))
print("팝:", p)
print("리스트:", my_list)
print(id(p), id(my_list))
# .append와는 달리 pop는 새로운 객체를 생성합니다.
1843657065600
팝: 1
리스트: [2, 3]
1843574827312 1843657065600
In [10]:
# reverse() 메써드 사용
my_list = ["A", "B", "C", "D", "E"]
print(id(my_list))
my_list.reverse()
print(id(my_list), my_list)
1843657067264
1843657067264 ['E', 'D', 'C', 'B', 'A']
In [11]:
# 만약 reverse() 함수의 결과를 다른 변수로 받는다면?
my_list = ["A", "B", "C", "D", "E"]
print(id(my_list), my_list)
new_list = my_list.reverse()
print(id(new_list), new_list)
print(type(new_list))
# reverse 매소드도 새로운 객체를 생성하지 않습니다.
1843657068992 ['A', 'B', 'C', 'D', 'E']
140704014310616 None
<class 'NoneType'>
In [12]:
# 만약 reverse 된 새로운 리스트를 만들고 싶다면?
my_list = ["A", "B", "C", "D", "E"]
new_list = my_list[::-1]
new_list, my_list
# 슬라이싱을 이용하여 새로운 객체를 생성할 수 있습니다.
Out[12]:
(['E', 'D', 'C', 'B', 'A'], ['A', 'B', 'C', 'D', 'E'])
In [13]:
# 정렬 sort() 메써드 사용하면 오름차순으로 정렬합니다.
my_list = [3, 1, 4, 1, 5, 9, 2]
my_list.sort()
my_list
Out[13]:
[1, 1, 2, 3, 4, 5, 9]
In [14]:
# 정렬 sort() 메써드 사용 :reverse=True를 사용하면 내림차순으로 정렬합니다.
my_list = [3, 1, 4, 1, 5, 9, 2]
my_list.sort(reverse=True)
my_list
Out[14]:
[9, 5, 4, 3, 2, 1, 1]
In [15]:
# 정렬 sort() 메써드 사용 : reverse=False를 사용하면 오름차순으로 정렬합니다.
my_list = [3, 1, 4, 1, 5, 9, 2]
my_list.sort(reverse=False)
my_list
Out[15]:
[1, 1, 2, 3, 4, 5, 9]
In [16]:
# 문자열을 정렬하면 다음의 결과를 얻을 수 있습니다. 대문자가 먼저 정렬됩니다.
my_list = ['Python', "Beyond", "hello", "compilers", "apple", "Apple"]
my_list.sort()
my_list
Out[16]:
['Apple', 'Beyond', 'Python', 'apple', 'compilers', 'hello']
이 외에도 다양한 메써드들이 제공됩니다.
In [17]:
# 리스트안에 있는 모든 원소를 제거하여 빈 리스트를 만듭니다.
my_list = [3, 1, 4, 1, 5, 9, 2]
my_list.clear()
my_list
Out[17]:
[]
In [18]:
# count() 매소드를 통해 리스트내에 있는 원소의 개수를 셀 수 있습니다.
my_list = ["내가", "아주", "아주", "아주", "많이", "사랑해"]
my_list.count("아주")
Out[18]:
3
In [19]:
# extend() 매소드를 사용하여 리스트를 확장할 수 있으며 추가되는 리스트는 뒤에 위치합니다.
my_list = [1, 2, 3]
list_to_add = [4, 5, 6]
my_list.extend(list_to_add)
my_list
Out[19]:
[1, 2, 3, 4, 5, 6]
In [20]:
# 리스트 원소의 인데스를 찾는 방법입니다.
my_list = ["내가", "아주", "아주", "아주", "많이", "사랑해"]
my_list.index("아주")
Out[20]:
1
In [21]:
# 중복된 원소의 경우 두번째 '아주'의 인덱스를 찾는 방법입니다.
my_list = ["내가", "아주", "아주", "아주", "많이", "사랑해"]
my_list.index("아주", my_list.index("아주") + 1)
Out[21]:
2
In [22]:
# 중복된 원소의 경우 두번째 '아주'의 인덱스를 찾는 방법입니다.
my_list = ["내가", "아주", "아주", "아주", "많이", "사랑해"]
my_list.index("아주", my_list.index("아주") + 2)
Out[22]:
3
In [23]:
my_list = ["내가", "아주", "아주", "아주", "많이", "사랑해"]
my_list.index("사랑해")
Out[23]:
5
In [24]:
# 리스트의 원소를 제거하는 매소드입니다. 인덱스가 낮은 순으로 제거합니다.
my_list = ["내가", "아주", "아주", "아주", "많이", "사랑해"]
my_list.remove("아주")
my_list
Out[24]:
['내가', '아주', '아주', '많이', '사랑해']
In [25]:
# 선택한 인덱스 자리에 원하는 원소를 삽입하는 방법입니다.
my_list = ["A", "B", "D", "E"]
my_list.insert(2, "C")
my_list
Out[25]:
['A', 'B', 'C', 'D', 'E']
중첩 리스트 (Nested List)
리스트 안에 리스트를 넣을 수도 있습니다.
In [26]:
my_list = [["Hello", 1, 2], 3, 4, [5, "Apple"]]
In [27]:
# 중첩 리스트의 인덱싱
my_list[0], type(my_list[0])
Out[27]:
(['Hello', 1, 2], list)
In [28]:
# 리스트를 인덱싱한 결과가 리스트인 경우 인덱싱을 한 번 더 할 수 있습니다.
my_list[0][0]
Out[28]:
'Hello'
In [29]:
# 세 개의 리스트를 만들어 봅시다.
# 리스트의 리스트를 만들어 보면 3 * 3 정사각행렬이 됩니다.
m0 = [1, 2, 3]
m1 = [4, 5, 6]
m2 = [7, 8, 9]
matrix = [m0, m1, m2]
matrix
Out[29]:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
In [30]:
matrix[1]
Out[30]:
[4, 5, 6]
In [31]:
matrix[2][0]
Out[31]:
7
가변 컨테이너에 가변 객체를 넣을 때는 주의해야 합니다.
In [32]:
my_list = ["Hello", 2, 3, 4, 5]
# copy() 메써드를 이용해서 내용이 동일한 리스트 객체를 새로 만들어줍니다.
new_list = my_list.copy()
print(id(my_list), id(new_list))
print(my_list, new_list)
# 리스트 자체는 새로 만들어졌어요(아이디 주소가 서로 다릅니다.)
1843656721920 1843657049216
['Hello', 2, 3, 4, 5] ['Hello', 2, 3, 4, 5]
In [33]:
# 그러나 원소들은 동일한 원소를 사용하기 때문에
# 메모리 사용량을 줄이기 위해 주소가 같습니다.
id(my_list[0]), id(new_list[0])
Out[33]:
(1843657042032, 1843657042032)
In [34]:
# 불변 객체를 바꿔줄 경우
my_list[0] = "New World"
print(my_list[0], new_list[0])
print(id(my_list[0]), id(new_list[0]))
New World Hello
1843657262704 1843657042032
동일한 원소를 사용했기에 원소에 대해 아이디가 같았지만
원소를 변경한 경우 그 원소의 아이디는 당연히 달라집니다.
In [35]:
# 리스트 안에 가변 객체를 넣었습니다.
# 동일하지만 새로운 리스트 객체를 만들어줍니다.
import copy
my_list = [["Hello"], [1, 2, 3]]
new_list = copy.deepcopy(my_list)
id(new_list), id(my_list)
Out[35]:
(1843657262144, 1843657077568)
In [36]:
my_list, new_list
Out[36]:
([['Hello'], [1, 2, 3]], [['Hello'], [1, 2, 3]])
In [37]:
# 새로운 리스트의 아이템만 수정할 수 있습니다.
my_list = [["Hello"], [1, 2, 3]]
new_list = copy.deepcopy(my_list)
new_list[0][0] = "Hell"
new_list[1][0] = 1024
my_list, new_list
Out[37]:
([['Hello'], [1, 2, 3]], [['Hell'], [1024, 2, 3]])
리스트와 for 루프
In [38]:
# for문과 리스트
my_list = ["Hello", 2, 3, 4, 5]
for i in my_list:
print(i)
Hello
2
3
4
5
In [39]:
# 차이점을 비교해 보세요
my_list = ["Hello", 2, 3, 4, 5]
for i in my_list:
print(i, end="")
Hello2345
In [40]:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for list_list in matrix:
print(list_list)
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
In [41]:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for list_list in matrix:
for i in list_list:
print(i)
1
2
3
4
5
6
7
8
9
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받을 수 있습니다.
반응형
'수학과 코딩' 카테고리의 다른 글
파이썬(python)컨테이너(container) 집합(set) 사용법 및 특징 (0) | 2022.07.27 |
---|---|
파이썬(python) 튜플(tuple)과 시퀀스(sequense) 정리 (0) | 2022.07.27 |
파이썬(python) 컨테이너(containers)-리시트(list)의 사용 방법(가변성) (0) | 2022.07.26 |
파이썬(python) 문자열(string) 사용법(use)_불변성, 매소드, 포맷팅 (0) | 2022.07.25 |
파이썬(python) 문자열(string) 사용법(use)_리터럴(literal), 출력(print), 인덱싱(indexing), 슬라이싱(slicing) (0) | 2022.07.24 |
댓글