컬렉션과 반복문

현서·2025년 1월 2일

파이썬

목록 보기
14/27
post-thumbnail

1. 이터러블과 이터레이터

1. 이터러블(iterable)

for문처럼 반복문에서 사용할 수 있는 모든 객체를 의미한다.
이터러블한 객체는 for item in 객체: 구조에서 사용 가능하다.
모든 순서 있는 컬렉션은 이터러블이지만, 모든 이터러블이 순서 있는 것은 아니다.
(set, dict.keys()는 반복은 되지만 인덱스가 없음)

2. 이터레이터(Iterator)

이터러블 객체는 iter() 함수를 사용해서 이터레이터로 바꿀 수 있다.
또한 next()를 사용해서 값을 하나씩 꺼낼 수 있다.

numbers = [10, 20, 30]
# 이터러블 -> 이터레이터로 변환
iterator = iter(numbers)

# next()로 값을 하나씩 꺼냄
print(next(iterator))
print(next(iterator))
print(next(iterator))
# print(next(iterator)) # → 여기서 더 꺼내면 StopIteration 예외 발생
10
20
30

2. 리스트와 for 문

li1 = ['apple', 'banana', 'orange', 'melon']

for i in li1:
    print(i, end=' ')
apple banana orange melon
# score 리스트에 저장된 점수가 60점 이상인 학생이 몇명인지 확인
score = [90, 30, 50, 60, 80, 70, 100, 40, 20, 10]
count = 0

for i in score :
  if i >= 60:
    count += 1

print(f'60점 이상인 학생의 수는 {count}명 입니다')
60점 이상인 학생의 수는 5명 입니다

→ score 안을 i가 하나씩 증가하며 돌아다니다가 i가 60보다 큰 수가 발견되면 count 1 증가!

3. 딕셔너리와 for 문

dic1 = {'no':1, 'userid':'apple', 'name':'김사과', 'hp':'010-1111-1111'}

for i in dic1:
    print(i, end=' ') # 키만 복사

print()
for i in dic1.keys():
    print(i, end=' ') # 키만 복사

print()
for i in dic1.values():
    print(i, end=' ') # 값만 복사

print()
for i in dic1:
    print(dic1[i], end=' ') # 키를 복사하여 값을 반환

print()
for i in dic1:
    print(dic1.get(i), end=' ')
no userid name hp 
no userid name hp 
1 apple 김사과 010-1111-1111 
1 apple 김사과 010-1111-1111 
1 apple 김사과 010-1111-1111
for i in dic1.items(): # items() 딕셔너리에 있는 keys와 values를 튜플로 가져옴.
    print(i)
('no', 1)
('userid', 'apple')
('name', '김사과')
('hp', '010-1111-1111')
for key, value in dic1.items():
    print(key, value)
no 1
userid apple
name 김사과
hp 010-1111-1111

4. 컴프리헨션(Comprehension)

  • 파이썬에서 리스트, 세트, 딕셔너리 등의 컬렉션을 간단하게 생성하거나 변형하는 방법 중 하나
  • 반복문과 조건문을 사용하여 간결하게 컬렉션을 생성하는 기법
  • 코드를 더 간단하고 가독성 좋게 작성할 수 있도록 도와준다.

1. 리스트 컴프리헨션

n = 10

result = [0 for i in range(n)]
print(result)

result = [i for i in range(n)]
print(result)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
li = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

result = [n for n in li]
print(result)

result = [n*2 for n in li]
print(result)
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
[20, 40, 60, 80, 100, 120, 140, 160, 180, 200]

위 result는 n을 n만큼 반복하여 출력. n은 li 안에 있는 숫자들 의미.
위 result는 n*2을 n만큼 반복하여 출력. n은 li 안에 있는 숫자들 의미.

li = ['apple', 'banana', 'orange', 'melon']

result = [len(str1) for str1 in li]
print(result)
[5, 6, 6, 5]

li 안에 값을 str1이라고 하고, str1의 길이를 len(str1)이라고 함.
각각의 문자열의 길이 출력

result = [n for n in range(10) if n % 2 == 0]
print(result)
[0, 2, 4, 6, 8]

range(10) 안의 수 n이 2로 나누어떨어지면, n출력

# 양수는 리스트에 그대로 저장하고, 음수는 0으로 변환해서 저장하기
li = [-1, 0, -4, 24, 5, -10, 2, 20]
result = [n if n>0 else 0 for n in li]
print(result)
[0, 0, 0, 24, 5, 0, 2, 20]

li 안에 있는 n들 중에 n이 양수이면 그대로 출력, 음수이면 0으로 변환해서 출력

li = []

for i in range(1, 4):
    for j in range(1, 3):
        li.append(i * j)
print(li)

li = [i*j for i in range(1, 4) for j in range(1, 3)]
print(li)
[1, 2, 2, 4, 3, 6]
[1, 2, 2, 4, 3, 6]

위,아래 코드 출력 결과는 같지만,
위 코드는 for 중첩 반복문을 통해 작성되었고,
아래 코드는 컴프리헨션을 통해 작성되었다.
컴프리헨션을 통해 짠 코드가 더 간결하다.

2 세트 컴프리헨션

  • 새로운 세트를 생성하는데 사용
  • 기존 세트의 각 요소를 반복하면서 조건을 적용하여 새로운 세트를 생성할 수 있다.
li = [1, 2, 3, 4, 5, 2, 3, 4]
unique_numbers = set(li)
print(unique_numbers)

li = [1, 2, 3, 4, 5, 2, 3, 4]
unique_numbers = {x for x in li}
print(unique_numbers)
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}

set는 중복 불가능이었다.
li에 있는 수 x를 unique_numbers로 출력

3 딕셔너리 컴프리헨션

  • 새로운 딕셔너리를 생성하는데 사용
  • 기존 딕셔너리의 키와 값을 반복하면서 조건을 적용하여 새로운 딕셔너리를 생성할 수 있다.
names = ['apple', 'banana', 'orange']
name_lengths = {name:len(name) for name in names}
print(name_lengths)
{'apple': 5, 'banana': 6, 'orange': 6}

names에 있는 name의 길이를 확인하여, name:len(name) 형태로 출력

profile
The light shines in the darkness.

0개의 댓글