본문 바로가기
Study (Data Science)/Python

Unit 22. List 와 Tuple / 리스트표현식(list comprehension)

by 콜라찡 2022. 11. 25.

List [ ] : mutable sequence type (변경할 수 있는 시퀀스 자료형)

Tuple ( ) : immutable sequence type (변경할 수 없는 시퀀스 자료형)

 

 

method (method = 함수)

1. 기본내용 

  • Add (list만 가능)
    • append(요소) : element 한 개 or list 하나씩 중첩으로. 꼭 하나씩 추가 가능
    • extend([리스트])  : list + list = 1개의 list 로 가능. append로 일일이 못할때 유용
    • insert(인덱스번호,요소) : 특정인덱스에 요소 하나를 추가
      • insert(0, 요소): 리스트의 맨 처음에 요소를 추가
      • insert(len(리스트), 요소): 리스트 끝에 요소를 추가
    • 슬라이스로도 추가가능 : 리스트 끝에 하나의 요소만 추가 가능. a[len(a):] = [값]
# append
>>> a = [10, 20]
>>> a.append(30)           # element 추가하기
>>> a.append([500, 600])   # list 추가하기
>>> a
[10, 20, 30, [500, 600]]   # 리스트 중첩으로 append 가능
>>> len(a)
4

#extend
>>> a = [10, 20, 30]
>>> a.extend([500, 600])
>>> a
[10, 20, 30, 500, 600]    # 리스트 중첩이 아니라 하나로 생성
>>> len(a)
5

#insert
>>> a = [10, 20, 30]
>>> a.insert(2, 500)
>>> a
[10, 20, 500, 30]         # 2번인덱스에 500 넣어죠
>>> len(a)
4

>>> a = [10, 20, 30]
>>> a.insert(len(a), 500) # 리스트 끝에 500 넣어죠
>>> a
[10, 20, 30, 500]

>>> a = [10, 20, 30]
>>> a.insert(1, [500, 600])  # 이렇게하면 append로 list 넣는것과 똑같아짐
>>> a
[10, [500, 600], 20, 30]

>>> a = [10, 20, 30]
>>> a[1:1] = [500, 600]      # 리스트 중간에 여러개 넣고 싶을때는 슬라이싱
>>> a
[10, 500, 600, 20, 30]

# 슬라이싱으로 끝에 하나 추가하기
>>> a = [10, 20, 30]
>>> a[len(a):] = [500]      # a리스트의 길이 = 끝에 추가
>>> a
[10, 20, 30, 500]

>>> a = [10, 20, 30]
>>> a[len(a):] = [500, 600]
>>> a
[10, 20, 30, 500, 600]

 

  • Delete (list만 가능)
    • pop(인덱스번호) : 마지막 요소 또는 특정 인덱스의 요소를 삭제. 인덱스번호가 필요.
    • remove(값): 특정 값을 찾아서 삭제. 인덱스번호 몰라도 됨.
      • index(값) : 값만알고, 인덱스번호를 모를때에 이렇게하면 찾아짐.  tuple도 이건가능
    • clear() : 리스트의 모든요소 삭제 후 빈리스트로 만듬
# pop = del 
>>> a = [10, 20, 30]
>>> a.pop()            # 리스트의 마지막 요소 한개만 삭제해
30                     # 삭제할 것 보여줌
>>> a
[10, 20]

>>> a = [10, 20, 30]
>>> a.pop(1)           # 리스트에서 1번 인덱스 삭제해
20
>>> a
[10, 30]

# remove
>>> a = [10, 20, 30]
>>> a.remove(20)       # 20이라는 값을 삭제해줘
>>> a
[10, 30]

# index
>>> a = [10, 20, 30, 15, 20, 40]
>>> a.index(20)        # 20이란 값의 인덱스 번호 추출
1

>>> a = (38, 21, 53, 62, 19, 53)  # >>>>>>>>>튜플
>>> a.index(53)
2

# clear
>>> a = [10, 20, 30]
>>> a.clear()
>>> a
[]
  • ETC (tuple도 가능)
    • count(값) : 리스트 안의 특정 값이 몇개인지 카운팅
    • reverse() : 순서 반대로 뒤집기
    • sort() 또는 sort(reverse=False): 리스트의 값을 작은 순서대로 정렬(오름차순)
      • sort(reverse=True): 리스트의 값을 큰 순서대로 정렬(내림차순)
      • sorted(리스트이름) : 정렬해서 새로운 리스트로 만듬
# count
>>> a = [10, 20, 30, 15, 20, 40]
>>> a.count(20)
2

# reverse
>>> a = [10, 20, 30, 15, 20, 40]
>>> a.reverse()
>>> a
[40, 20, 15, 30, 20, 10]

# sort
>>> a = [10, 20, 30, 15, 20, 40]
>>> a.sort()
>>> a
[10, 15, 20, 20, 30, 40]              # 기존 리스트를 정렬

# sorted
>>> b = [10, 20, 30, 15, 20, 40]
>>> sorted(b)                         # .sorted가 아니라 sorted(b)
[10, 15, 20, 20, 30, 40]              # 정렬된 새 리스트를 생성
 
참고 | 리스트가 비어 있는지 확인하기 (from. 코딩도장)

리스트(시퀀스 객체)가 비어 있는지 확인하려면 어떻게 해야 할까요? 방법은 간단합니다. 리스트는 len 함수로 길이를 구할 수 있죠? 이걸 if 조건문으로 판단하면 리스트가 비어 있는지 확인할 수 있습니다.

if not len(seq):    # 리스트가 비어 있으면 True
if len(seq):        # 리스트에 요소가 있으면 True

하지만 파이썬에서는 이 방법보다 리스트(시퀀스 객체)를 바로 if 조건문으로 판단하는 방법을 권장합니다(PEP 8).

if not seq:    # 리스트가 비어 있으면 True
if seq:        # 리스트에 내용이 있으면 True

특히 리스트가 비어 있는지 확인하는 방법은 리스트의 마지막 요소에 접근할 때 유용하게 사용할 수 있습니다. 리스트의 마지막 요소에 접근할 때는 인덱스를 -1로 지정하면 되죠?

>>> seq = [10, 20, 30]
>>> seq[-1]
30

만약 리스트가 비어 있을 경우에는 인덱스를 -1로 지정하면 에러가 발생합니다.

>>> a = []
>>> a[-1]
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    a[-1]
IndexError: list index out of range

이때는 if 조건문을 활용하여 리스트에 요소가 있을 때만 마지막 요소를 가져오면 됩니다.

seq = []
if seq:               # 리스트에 요소가 있는지 확인
    print(seq[-1])    # 요소가 있을 때만 마지막 요소를 가져옴

 

2. 할당과 복사 (list만 가능)

  • =, 할당 : b = a 라고 하면 a와 b가 동일의 리스트를 공유하는 것. 리스트 내용 바뀌면 a,b 모두 바뀜
  • copy(), 복사 : a를 가져와 b로 복사. 리스트 내용이 바껴도 원본에는 지장이 없음.
@ = 할당
>>> a = [0, 0, 0, 0, 0]
>>> b = a
>>> b[2] = 99
>>> a
[0, 0, 99, 0, 0]
>>> b
[0, 0, 99, 0, 0]


# copy 복사
>>> a = [0, 0, 0, 0, 0]
>>> b = a.copy()
>>> b[2] = 99
>>> a
[0, 0, 0, 0, 0]
>>> b
[0, 0, 99, 0, 0]

 

3. 요소 출력하기 (tuple도 가능)

요소를 출력할 때 인덱스 지정으로 요소를 하나 하나씩 추가해야해서 귀찮음. 반복문으로 자동화 출력 시키기.

  • for 인덱스, 요소 in enumerate(리스트) : 반복문으로 요소 출력할 때 인덱스도 같이 나오게 하는 방법
# 기본
>>> for i in [38, 21, 53, 62, 19]:
...     print(i)
>>> for i in range(len(a)):
...     print(a[i])

# 인덱스 번호와 함께 출력하기
>>> a = [38, 21, 53, 62, 19]
>>> for index, value in enumerate(a):
...     print(index, value)
...
0 38
1 21
2 53
3 62
4 19

# 인덱스번호 1부터 함께 출력하기
>>> for index, value in enumerate(a, start=1):   # start를 1로 지정해줌
...     print(index, value)
...
1 38
2 21
3 53
4 62
5 19
  • while 
# 기본
>>> a = [38, 21, 53, 62, 19]
>>> for i in range(len(a)):
...     print(a[i])
...
38
21
53
62
19

# 특정 값을 출력할 때
while i < len(a):
    print(a[0])           # 인덱스 번호를 [ ] 사이에 넣어줌
    i += 1
38
38
38
38
38
  • max, min, sum
>>> a = [38, 21, 53, 62, 19]
>>> min(a)
19
>>> max(a)
62
>>> sum(a)
193
  • 리스트 표현식 (list comprehension) : 리스트안에 for와 if를 쓸 수 있는 파이썬의 특징

>>> a = [i for i in range(10)]        # 0부터 9까지 숫자를 생성하여 리스트 생성
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> c = [i + 5 for i in range(10)]    # 0부터 9까지 숫자를 생성하면서 값에 5를 더하여 리스트 생성
>>> c
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

>>> d = [i * 2 for i in range(10)]    # 0부터 9까지 숫자를 생성하면서 값에 2를 곱하여 리스트 생성
>>> d
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

>>> a = [i for i in range(10) if i % 2 == 0]    # 0~9 숫자 중 2의 배수인 숫자(짝수)로 리스트 생성
>>> a
[0, 2, 4, 6, 8]

>>> b = [i + 5 for i in range(10) if i % 2 == 1]    # 0~9 숫자 중 홀수에 5를 더하여 리스트 생성
>>> b
[6, 8, 10, 12, 14]

>>> a = tuple(i for i in range(10) if i % 2 == 0)   # >>>>>>>>>> 튜플
>>> a
(0, 2, 4, 6, 8)

이렇게 여러개가 중첩될 때에는, i와 j의 조건식이 역순으로 와야한다. i > j >for j > for i

# 구구단 식
a = [i * j for j in range(2, 10)       # 2부터 9까지 나오고
           for i in range(1, 10)]      # 1부어 9까지 나오고
      # i * j 되어서 a라는 리스트에 들어감
  • map 함수에 적용하기
    • map 함수 : 지정된 함수로 처리해주는 함수. 처리된 결과는 새로운 객체로 저장함 (like copy)
>>> a = [1.2, 2.5, 3.7, 4.6]
>>> a = list(map(int, a))         # a요소들을 int 정수로 map이 함수돌리고 새 list로 저장
>>> a
[1, 2, 3, 4

>>> a = list(map(str, range(10))) # a요소들을 문자열로 map이 함수돌리고 새 list로 저장
>>> a
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']


>>> a = (1.2, 2.5, 3.7, 4.6)
>>> a = tuple(map(int, a))        # >>>>>>>> 튜플
>>> a
(1, 2, 3, 4)
728x90

댓글