Python

Python(8) 리스트

UserDonghu 2023. 9. 12. 18:20

리스트

덧셈과 곱셈

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

print(a + b) # [1, 2, 3, 4, 5, 6, 7, 8]

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

 

곱셈 주의

a = [1, 2, 3]
a = [a * 2] * 2 # 리스트 컴프리헨션 사용해서 만드는것을 권장.

print(a) # [[1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3]]
id(a[0]), id(a[1])
a[0][0] = 10000
print(a) # [[10000, 2, 3, 1, 2, 3], [10000, 2, 3, 1, 2, 3]]

 

리스트 슬라이싱

l = [1, 2, 3, 4, 5]
print(l[:])     # 출력: [1, 2, 3, 4, 5]
print(l[::-1])  # 출력: [5, 4, 3, 2, 1]
print(l[::2])   # 출력: [1, 3, 5]

 

이런식으로도 리스트 사용 가능

z = [
    10,
    20,
    30,
    40,
]
print(z[0]) # 10

 

연습문제

# 문제 1: 짝수를 모두 더해주세요
# 문제 2: 3의 배수와 5의 배수를 모두 더해주세요.
# 문제 3: 1부터 90까지의 짝수를 모두 더해주세요.

a = list(range(101))

# 문제 1
print(sum(a[::2]))

# 문제 2
print(sum(set(a[::3]+a[::5])))

# 문제 3
print(sum(a[:91][::2]))

 

리스트 메서드

append : 리스트에 추가

l = [1, 2, 3]
l.append(100)
print(l) # [1, 2, 3, 100]

 

clear : 리스트 초기화

l = [1, 2, 3]
l.clear()
print(l) # []

 

copy : 얕은 복사

l = [10, 20, 30]
ll = l
print(id(l), id(ll)) # 같은 주소 136443233105536 136443233105536
l[0] = 1000 # 둘다 수정됨
print(l, ll) # [1000, 20, 30] [1000, 20, 30]

ll = l.copy()
print(id(l), id(ll)) # 다른 주소 136443233105536 136442389991360
l[0] = 10
print(l, ll) # [10, 20, 30] [1000, 20, 30]

# copy랑 같음
ll = l[:] # 슬라이싱
print(id(l), id(ll)) # 다른 주소 136443233105536 136442391672320
l[0] = 1
print(l, ll) # [1, 20, 30] [10, 20, 30]

 

배열안의 배열

a = [10, 20]
b = [100, 200]

l = [a, b]
ll = l.copy() # 얕은 복사
print(id(l), id(ll)) # 136442390987136 136442390002624 다른 주소
print(id(l[0]), id((ll)[0])) # 안의 배열은 같은 주소 136442390599168 136442390599168
l[0][0] = 1000 # 둘다 바뀜
print(l, ll) # [[1000, 20], [100, 200]] [[1000, 20], [100, 200]] # 얕은 복사 이므로 안의 배열의 값은 같이 바뀜

 

깊은 복사

import copy # copy 모듈 사용

a = [10, 20]
b = [100, 200]

l = [a, b]
ll = copy.deepcopy(l) # 깊은 복사

print(id(l), id(ll)) # 134371342515264 134371342379072 주소 값이 다름
print(id(l[0]), id((ll)[0])) # 134371342471296 134371342336704 안의 배열도 주소 값이 다름
l[0][0] = 100000
print(l, ll) # [[100000, 20], [100, 200]] [[10, 20], [100, 200]] 값이 변경되지 않음

 

리스트 컴프리헨션으로 얕은 복사 구현

l = [[1, 2, 3], [4, 5, 6]]
ll = [i for i in l]
ll[0][0] = 1000
print(l) # [[1000, 2, 3], [4, 5, 6]] # 얕은 복사라서 값이 같이 바뀜
print(ll) # [[1000, 2, 3], [4, 5, 6]]

 

리스트 컴프리헨션으로 깊은 복사 구현 (완전하지는 않음)

l = [[1, 2, 3], [4, 5, 6]]
ll = [i[:] for i in l] # 깊은 복사 구현
ll[0][0] = 1000
print(l) # [[1, 2, 3], [4, 5, 6]]
print(ll) # [[1000, 2, 3], [4, 5, 6]]


# 완전하지 않은 이유.
a = [9, 99]
l = [[1, 2, a], [4, 5, 6]]
ll = [i[:] for i in l]
a[0] = 10000
print(l) # [[1, 2, [10000, 99]], [4, 5, 6]]
print(ll) # [[1, 2, [10000, 99]], [4, 5, 6]] 차원이 더 늘어나면 값이 변경됨.

 

같은 컨벤션 내에 정의된 같은 숫자는 동일한 메모리에 저장

a = [9999, 9999, 9999]
b = copy.deepcopy(a)
c = copy.deepcopy(b)

print(a, b, c) # [9999, 9999, 9999] [9999, 9999, 9999] [9999, 9999, 9999]
print(id(a[0]), id(b[0]), id(c[0])) # 134371344844368 134371344844368 134371344844368


test = {'one':9999, 'two':9998, 'three':9999}
print(id(test['one']), id(test['two']), id(test['three'])) # (134371344846128, 134371344845968, 134371344846128)

 

count : 요소의 반복을 카운트

print([1, 1, 1, 3, 3, 5, 6,].count(1)) # 3

print(list('1113356').count('1')) # 3

 

extend : 리스트를 합침

l = [10, 20, 30]
l.extend([10, 20])
print(l) # [10, 20, 30, 10, 20]

l.extend('hello')
print(l) # [10, 20, 30, 10, 20, 'h', 'e', 'l', 'l', 'o']

# 한 자리씩 잘라서 숫자 넣기
userinput = input('숫자를 입력하세요: ') # 100
l.extend(map(int,userinput)) # map으로 하나씩 int로 바꿔서 extend
print(l) #  [10, 20, 30, 10, 20, 'h', 'e', 'l', 'l', 'o', 1, 0, 0]

 

insert : 특정 인덱스에 요소 넣기

l = [10, 20, 30, 40, 50]
l.insert(2, 25) # 1번째와 2번째 인덱스 사이에 25 넣음
print(l) # [10, 20, 25, 30, 40, 50]

 

pop : 요소를 빼내고 반환

l = [10, 20, 30, 40, 50]
print(l.pop()) # 50
print(l) # [10, 20, 30, 40]

print(l.pop(0)) # 첫번째에서 빼는 것 10
print(l) # [20, 30, 40]

l = [1, 2, 3, 4, 5]
while l:
    print(l.pop(0))
    
# 1
# 2
# 3
# 4
# 5

 

remove : 처음 만나는 요소 제거

a = [1, 2, 3, 1, 2]
a.remove(2) # 처음에 만나는 2만 제거
print(a) # [1, 3, 1, 2]

# 모든 2를 다 제거하고싶으면
l = [1, 2, 3, 1, 2]
print(list(filter(lambda x:x!=2, l))) # filter로 2가 아닌것만 필터링 [1, 3, 1]

l = [1, 2, 3, 1, 2]
while l.count(2): # l에 2가 있으면 반복
    l.remove(2)
print(l) # [1, 3, 1]

l = [1, 2, 3, 1, 2]
while 2 in l: # l에 2가 있으면 반복
    l.remove(2)
print(l) # [1, 3, 1]

 

reverse : 리스트를 뒤집음

l = [1, 2, 10, 3, 4]
l.reverse()
print(l) # [4, 3, 10, 2, 1]

 

reverse, reversed의 차이 / sort, sorted의 차이

l = [1, 2, 10, 3, 4]
print(list(reversed(l))) # [4, 3, 10, 2, 1]
print(l) # 원본은 그대로 # [1, 2, 10, 3, 4]

print(l.reverse()) # 출력 None
print(l) # 원본이 수정됨 [4, 3, 10, 2, 1]

l = [1, 2, 10, 3, 4]
print(sorted(l)) # [4, 3, 10, 2, 1]
print(l) # 원본은 그대로 [1, 2, 10, 3, 4]

print(l.sort()) # 출력 None
print(l) # 원본이 수정됨 [4, 3, 10, 2, 1]

'Python' 카테고리의 다른 글

Python(10) 리스트 컴프리헨션, 삼항 연산자  (0) 2023.09.13
Python(9) 튜플, 딕셔너리, Set(집합)  (0) 2023.09.13
Python(7) 함수  (0) 2023.09.12
Python(6) 연산  (0) 2023.09.11
Python(5) 메서드 체이닝, 형변환  (0) 2023.09.11