-
[Python] for문에서 리스트를 사용할 때 주의해야하는 것내일배움캠프/Python 2024. 7. 19. 21:27
for문에서 반복 가능한 객체의 요소 삭제
for i in section:
for j in section:
if j in range(i,i+m)
section.remove(j)
cnt += 1for문은 반복 가능한 객체의 요소를 할당해서 반복을 하게 되는데요,
요소를 삭제하게 되면 원하는 결과가 나오지 않을 수도 있습니다.
그 이유는 for문이 요소를 가져오는 방법에 의해 생기는 것입니다.
반복 가능한 객체 section에서 직접 요소를 가져오는 방식인
for i in section이든
반복 가능한 객체 section에 인덱스 번호를 할당하여 불러오는 방식인
for i in range(len(section))이든
for문은 해당 반복 가능한 객체에서의 앞에서 순서를 매겨서 가져오기 때문입니다.
예를 들어
section = [1,2,3,4,5]라고 할 때
for문이 요소를 가져오는 방식은
section의 첫 번째 요소, 두 번째 요소... 세 번째 요소..
이렇게 읽어옵니다.
따라서 만약 for문이 한 번 돌아서
section의 1을 삭제한다면
section은 [2,3,4,5]가 되고
그 다음으로 가져오는 요소는
2가 아닌 3이 되게 되는 것입니다.
1을 삭제했기 때문에
section의 두번 째 요소는
2가 아닌 3이 되기 때문입니다.
따라서 for문을 사용할 때
반복 가능한 객체의
삭제를 조심해야 합니다..
for문에서 순서뒤집기
def solution(my_string, queries):
my_string = list(my_string)
for i, j in queries:
my_string[i:j+1] = my_string[i:j+1][::-1]
return ''.join(my_string)위의 코드는 my_string의 i부터 j 인덱스까지의 순서를 뒤집는 것입니다.
다시말해 j부터 먼저 나오고 뒤이어 i가 나오게 거꾸로 읽는 것입니다.
반복 가능한 객체에서 거꾸로 읽는 방법은
[i:j][::-1]과 [j:i-1:-1]이 있는데요,
후자의 방식을 조심해야 합니다.
왜냐하면 i-1이 0보다 작아질 수 있기 때문입니다.
그렇다면 의도한 결과와 달라질 수 있습니다.
복사본 만들기
def solution(arr):
cnt = 0
result = []
while result != arr:
result = arr[:]
for i in range(len(arr)):
if arr[i]%2==0 and arr[i]>=50:
arr[i] = arr[i] // 2
elif arr[i]%2==1 and arr[i]<50:
arr[i] = (arr[i]*2) + 1
cnt += 1반복문을 돌고나서
기존의 arr값을 result에 저장하고 싶을 때
result = arr를 하면 원하지 않는 결과가 나올 수 있습니다.
왜냐하면 반복문을 돌고난 arr의 값이
result에 바로 반영되기 때문입니다.
따라서 이 때는 arr을 복사한 값을 result에 저장해줘야 합니다.
arr을 복사하는 방법은
정말 간단합니다.
arr의 모든 원소를 슬라이싱하는
arr[:]를 사용해주면 됩니다.
이 방법을 이용하면
반복문을 돌기 전의 값과 반복문을 돌고난 후의 값 비교할 수 있게 됩니다!
'내일배움캠프 > Python' 카테고리의 다른 글
[Python] 파이썬 소수 구하기 알고리즘 (0) 2024.07.24 [Pandas] 집계함수 살펴보기 (2) 2024.07.22 [Python] 파이썬 문제 해결 전략 (5) (2) 2024.07.18 [Python] 정규표현식 (기초편) (0) 2024.07.15 [Python] 파이썬 문제 해결 전략 (4) (0) 2024.07.12