Try to 개발자 EthanJ의 성장 로그

Python Data type (list) 파이썬 자료형(리스트) 본문

CS & DS/Basic Python with Data Crawling

Python Data type (list) 파이썬 자료형(리스트)

EthanJ 2022. 10. 8. 17:22

Python Data type 파이썬 자료형


4) 리스트(List)

- 여러 개의 아이템들을 저장하는 객체 = 여러 개의 값(다양한 data type)을 저장하는 그릇
- 문법 기호 : [아이템1, 아이템2, 아이템3 .... ]
- 용어 : 아이템 = 요소
- 아이템으로 가질 수 있는 데이터 타입 : 문자, 숫자, 리스트, 딕셔너리 ...
- 종류

  • 아이템이 없는 리스트
  • 1차원 리스트
  • 다차원 리스트

 

- 특징

  • 인덱스 활용
  • 다차원 리스트의 구조에 대한 이해

 

1. 생성하기

# 아이템이 없는 리스트 == 빈 리스트 생성하기 
# 문법 : []
# 함수 : list()

a = []
a2 = list()

print(type(a), type(a2))
print(a, a2)
<class 'list'> <class 'list'>
[] []

 

# 모든 데이터 타입을 아이템으로 가질 수 있다.

a3 = ['a', 10, 1.1, [1, 23.1, 'a']]
a3
['a', 10, 1.1, [1, 23.1, 'a']]

 

#리스트가 하나의 요소로 들어감

a3[3]
[1, 23.1, 'a']

 

# n차원 리스트 > 인덱스 n번 해야 출력 가능, 리스트 속의 리스트가 몇 개니?
# 2차원 리스트 > 인덱스 2번 해야 출력가능 
# 2차원 데이터 > 마치 좌표처럼 데이터를 지목해 출력 가능

a3 = ['a', 10, 1.1, [1, 23.1, 'a']]
print(a3[3][2])
a

 

[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]

 

 

2. 인덱싱, 슬라이싱

  • 리스트를 인덱스 번호로 접근하면 해당 위치의 값(item)을 가져온다

 

- 복습

  • 첫 번째 인덱스 번호 == 0
  • 마지막 인덱스 번호 == -1

 

인덱싱(indexing)

  • 특정 위치에 있는 하나의 아이템에 접근 > "하나"의 item
#리스트 생성하기

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

#첫 번째 아이템 인덱스 번호: 0
#인덱싱 문법 : 객체[인덱스 번호]

a[0]
1

 

#리스트에서 아이템 6 가져오기

a[5]
6

 

#리스트의 마지막 값 확인하기

print(a[8])
print(a[-1])
print(a[len(a)-1])
9
9
9

 

#len()은 인덱스 번호를 가지는 모든 자료의 길이를 세어준다. 

len(a)
9

 

슬라이싱(slicing)

  • 정의 복습 : 연속된 법위에 있는 하나 혹은 하나 이상의 여러 개 아이템에 접근한다
  • 문법 : 리스트[시작 index : 끝 index : (:간격)] > (끝 index -1)까지만 접근 
# 리스트의 0~2번째 아이템까지 확인하기

# 시작 index : 0
# 끝 index : 3 (3 - 1 = 2)까지 접근

a[0:3]
[1, 2, 3]

 

# 리스트의 3번째~끝까지 아이템 확인하기
# 시작 index == 2
# 끝 index == null (개념상 len(list))

print(a[2:])
print(a[2:len(a)])
[3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7, 8, 9]

 

3. 아이템 추가하기 : 연산자와 함수를 이용한 리스트 아이템 추가

  • 산술연산자 : +, *
  • 리스트의 함수(method) : list.append(item), list.extend(item), list.insert(index, item)

산술연산자

  • 종류 : +, *
  • 특징 : return value (!= None) > 원본 반영X
#리스트끼리 연결 : +

a = [1, 2, 3]
b = [4, 5, 6]
a + b
[1, 2, 3, 4, 5, 6]
  • enumerate는 리스트가 있는 경우 순서와 리스트의 값을 전달하는 기능을 합니다.

 

4. 리스트 타입의 함수 (methods of list)

- 종류

  • list.append(item) : parameter value를 통째로 list last item으로 추가 > 1개의 아이템만 추가 가능
  • list.extend(param) : param의 item을 뽑아서 list last item으로 추가 > 여러 개의 item 추가 가능
  • list.insert(index, item) : index 지정 item 삽입, item 통째로 추가

- 참고 연산자 : in 연산자 > 결과값 bool type

 

# 리스트 생성

a = [1, 2, 3]
a
[1, 2, 3]

 

# list.append(item)
# 문법 : [대상 list].append([추가할 item])

a.append(4)
a
[1, 2, 3, 4]

 

# 추가할 item == list라면?

a.append([5, 6])
print(a)
print(a[4])
[1, 2, 3, 4, [5, 6]]
[5, 6]
 
 
# list.extend(data)
# 문법 : [대상 list].extend(data)

# append(item) vs. extend(data) : extend(data) > item을 가진 data type만 parameter로 받을 수 있다
# > parameter data의 item을 개별적으로 받아서 caller list에 대입
# extend(data) : parameter data의 item 개수만큼 index 연장 vs. append(item) : index += 1

print(a)

a.extend([7, 8, 9])
print(a)

a.extend({'a':97, 'b':98, 'c':99})
print(a)
[1, 2, 3, 4, [5, 6]]
[1, 2, 3, 4, [5, 6], 7, 8, 9]
[1, 2, 3, 4, [5, 6], 7, 8, 9, 'a', 'b', 'c']

 

# extend(data) > 하나의 item만 넣어도 무조건 item가진 data(e.g. list)로 call 해야 함

a.extend([10])
print(a)
[1, 2, 3, 4, [5, 6], 7, 8, 9, 'a', 'b', 'c', 10]

 

# insert(index, item)
# 문법 : [대상 list].insert([index], [추가할 item])

# item 추가가 지정 index에 실행됨
# vs. append(item) : 둘 다 하나의 index 번호에 모든 data를 추가

a.insert(0, 100)
print(a)
[100, 1, 2, 3, 4, [5, 6], 7, 8, 9, 'a', 'b', 'c', 10]

 

# list.insert(item) > list item 교체 X, 추가 O > 실제로 소실되는 자료는 없음 > 내부적으로 (index += 1) 발생

a.insert(0, [99, 98])
a
[[99, 98], 100, 1, 2, 3, 4, [5, 6], 7, 8, 9, 10]

 

# in 연산자 > 특정 item이 list 내에 있는지 여부 출력
# 문법 : [item] in [list]

print(4 in a)
print(5 in a)
print(5 in a[6])
True
False
True

 

# not in 연산자 > 특정 item이 list 내에 없는지 여부 출력
# 문법 : [item] not in [list]

print(10 not in a)
False

 

> 연습문제

# 1) 빈 리스트 생성

list1 = []
# (list1 = []) == (list1 = list())
# 2) 1)번 리스트에 숫자 1, 2, 3을 아이템으로 추가

list1.extend([1, 2, 3])
# 3) 2)번 리스트의 2번째 index에 문자 100을 item으로 추가

list1.insert(2, "100")
# 4) 3)번 리스트의 마지막에 문자 A, B를 아이템으로 가진 list를 item으로 추가

list1.append(['A', 'B'])
# 5) 4)번 리스트의 아이템을 2번 반복해서 가지는 리스트를 출력

print(list1 * 2)
[1, 2, '100', 3, ['A', 'B'], 1, 2, '100', 3, ['A', 'B']]

 

5. 아이템 수정하기

  • indexing, slicing을 이용해서 item을 수정할 수 있다.
# 리스트 a 생성

a = list()
a = [1, 2, 3, 4, 5]
a
[1, 2, 3, 4, 5]

 

# 0번 index의 item을 [10, 20]으로 수정 > indexing

a[0] = [10, 20]
a
[[10, 20], 2, 3, 4, 5]

 

# 연속된 범위에 있는 여러개의 item 수정 > slicing

a2 = [1, 2, 3, 4, 5]
print(a2)

a2[:2] = [10, 20]
print(a2)
[1, 2, 3, 4, 5]
[10, 20, 3, 4, 5]

 

# slicing으로 값 할당시 주의점 > 전달값 1개여도 item가진 data로 할당해야 함
# > 동작원리가 list.extend(data)와 동일

a2[0:1] = [100]
a2

# indexing == append()
# slicing == extend()
[100, 20, 3, 4, 5]

 

> 연습문제

아래 조건에 맞추어 리스트를 수정하세요.

[ 10, 99, 3, '사과', 73, '바나나' ]

조건1) '사과'를 'apple'로 수정

조건2) 99, 3 을 9, 33으로 수정

조건3) 73 을 [ 73, 74 ] 로 수정

 

list_test = [10, 99, 3, '사과', 73, '바나나']
# 조건1)

list_test[3] = 'apple'
# 조건 2)

list_test[1:3] = [9, 33]
# 조건 3)

list_test[4] = [73, 74]
print(list_test)
[10, 9, 33, 'apple', [73, 74], '바나나']

 

6. item 삭제하기

  • slicing + empty list
  • del 키워드 + indexing or slicing
  • list.remove(item) > 값을 기준으로 삭제
  • list.pop() > parameter에 아무것도 입력하지 않거나, -1 입력시 > 마지막 index item 삭제
  • list.pop(index) > 특정 index 지정해서 item 삭제도 가능
# 리스트 생성

a1 = [10, 20, 30, 40, 50]
a2 = [10, 20, 30, 40, 50]

 

# 하나의 item 삭제 > (1) slicing + empty list
# index 0 item 삭제

a1[:1] = []
print(a1)
[20, 30, 40, 50]

 

# if indexing + empty list 대입 > empty list 그대로 들어감!!

a2[0] = []
print(a2)
# indexing만으로는 item 삭제 불가능!
[[], 20, 30, 40, 50]

 

# 하나의 item 삭제 > (2) del 키워드 + indexing

del a1[-1]
print(a1)
[20, 30, 40]

 

# indexing없이 del 키워드 + list > list 객체 자체 삭제

del a2
print(a2) # > Error
NameError: name 'a2' is not defined

 

# 하나의 item 삭제(3) > list.remove(item) 함수
# 문법 : list.remove(삭제할 item(!= index))

a = [1, 2, 3, 3, 3, 4, 5]
# value 5 item delete

a.remove(5)
a
[1, 2, 3, 3, 3, 4]

 

# 중복된 value item 존재 시 > 가장 앞선 item 하나만 삭제

a.remove(3)
a
[1, 2, 3, 3, 4]

 

# del 키워드 > not only 단일 item but also 연속된 범위(slicing) items 삭제도 가능

del a[2:]
a
[1, 2]

 

# 하나의 item 삭제 > (4) list.pop() 함수

a = [1, 2, 3, 4, 5]
a.append(6)
print(a)

# list.pop() > parameter index 미기입 > 마지막 index item 삭제 > item의 value를 확인시켜주고 삭제
# last item 삭제하는 메소드들 > 보통 삭제할 value 확인시켜주고 삭제

print(a.pop())
print(a)
[1, 2, 3, 4, 5, 6]
6
[1, 2, 3, 4, 5]

 

# list.pop(index) > index 지정 > 입력된 index의 item 삭제

print(a)

print(a.pop(2))
print(a)
[1, 2, 3, 4, 5]
3
[1, 2, 4, 5]

 

7. item 정렬

- 함수

  • list.sort() : 기본동작 > 오름차순 정렬
  • list.reverse() : 기존 list를 뒤집어서 정렬
# 값의 오름차순으로 정렬 : list.sort()
# 기본 동작 > sort(reverse = False) > 오름차순
# method return None > caller list 값 변경

a = [3, 4, 1, 5, 2]
print(a)

print(a.sort())
print(a)
[3, 4, 1, 5, 2]
None
[1, 2, 3, 4, 5]

 

# 값을 내림차순으로 정렬하는 경우 > list.sort(reverse = True)

a.sort(reverse = True)
print(a)
[5, 4, 2, 1]

 

# 값을 인덱스 기준으로 반대로 뒤집기 : list.reverse()
# method return None > caller changed

b = [10, 42, 34, 74, 17]
print(b.reverse())
print(b)
None
[17, 74, 34, 42, 10]

 

8. item 개수 세기

- 함수

  • list.count(item) : item이 list 내부에 몇 개 있는지 개수 리턴
  • len(list) : Python 내장 함수, list 내부 total item 개수 리턴
# 특정 item의 개수 : list.count(item)

a = [1, 2, 3, 3, 4, 5, 6]
print(a.count(6))

b = ['a', "abc", 5, 6, "a", a]
print(b.count('a'))
1
2

 

# list의 total item 개수 : len(list)

len(a)
7

 

9. 리스트 복사하기

  • 할당 기호(=) > shallow copy
  • list.copy() > deep copy
  • list(data) > deep copy
  • slicing + 할당 > deep copy
# 1. 할당기호(=)로 복사하기 > shallow copy

a = [1, 2, 3, 4, 5]
b = a 
# 할당기호(=)로 복사 > 주소값 복사 > shallow copy

print(a, b)
[1, 2, 3, 4, 5] [1, 2, 3, 4, 5]

 

# 변수가 가리키는 주소 출력 함수 : id(variable)

print(id(a), id(b))
1776272363776 1776272363776

 

# = 을 이용해 복사한 결과 > shallow copy

a[0] = 10
print(a, b)
[10, 2, 3, 4, 5] [10, 2, 3, 4, 5]

 

# 2. list.copy() method로 복사하기 > deep copy

c = a.copy()
print(id(a), id(c)) 
# 다른 주소 가리킴
1776272363776 1776255285504

 

# deep copy > a를 변경해도 c는 영향받지 않는다

a[1] = 20
print(a, b, c)
[10, 20, 3, 4, 5] [10, 20, 3, 4, 5] [10, 2, 3, 4, 5]

 

# 3. list(data) 함수로 복사 > deep copy
# list(data) > 해당 data를 새로 할당해 list로 만든다

d = list(c)
print(id(d), id(c))
1776272453952 1776255285504

 

# deep copy > c를 변경해도 d는 영향받지 않는다

c[2] = 30
print(c, d)
[10, 2, 30, 4, 5] [10, 2, 3, 4, 5]

 

# 4. slicing으로 (전체) 범위 지정해 할당 > deep copy

e = d[:]
print(id(e), id(d))
1776272393920 1776272453952

 

# deep copy > d를 변경해도 e는 영향받지 않는다

d[3] = 40
print(d, e)
[10, 2, 3, 40, 5] [10, 2, 3, 4, 5]

 

> 연습문제

1. a 리스트를 이용하여 다음과 같은 문자열을 출력하시오.
a = ['Life', 'is', 'too', 'short', 'you', 'need', 'python']
출력문 : you too

a = ['Life', 'is', 'too', 'short', 'you', 'need', 'python']

print(a[4], a[2])
you too

 

2. a 리스트의 길이를 구하시오

length = len(a)
print(length)
7

 

3. a 리스트의 첫번째 아이템에 길이를 추가하세요.

a.insert(0, len(a))
print(a)
[7, 'Life', 'is', 'too', 'short', 'you', 'need', 'python']

 

4. 아래와 같이 정렬되지 않은 리스트를 만들고 내림차순 정렬로 바꿔보세요.
[1, 4, 9, 2, 6, 10]

list_sort = [1, 4, 9, 2, 6, 10]
list_sort.sort(reverse = True)
print(list_sort)
[10, 9, 6, 4, 2, 1]
Comments