프로그래밍 언어/Python

[Python] iterator 함수 (zip, enumerate)

eunnys 2023. 10. 27. 09:53

zip()을 이용한 순회

  • 여러 시퀀스를 병렬로 순회하는 함수
  • 여러 시퀀스 중 가장 짧은 시퀀스가 완료되면 멈춘다.
  • 두 개 이상의 리스트, 튜플의 값을 병렬적으로 추출할 때 사용.
  • 추출된 데이터는 문자열, 리스트, 튜플 등으로 추출 가능

 

data1 = [1,2,3,4,5]
data2 = [10,20,30,40,50]
data3 = [100,200,300,400]

result1 = [x for x in zip(data1, data2)]
print(result1)

result2 = [sum(x) for x in zip(data1, data2, data3)]
print(result2)
[(1, 10), (2, 20), (3, 30), (4, 40), (5, 50)]
[111, 222, 333, 444]

 

yoil = ['월', '화', '수', '목', '금', '토', '일']
food = ['갈비탕', '순대국', '칼국수', '삼겹살']
menu = zip(yoil, food)
for y, f in menu:
    print('%s요일 메뉴:%s'%(y,f))

d = dict(zip(yoil, food))
print(d)
월요일 메뉴:갈비탕
화요일 메뉴:순대국
수요일 메뉴:칼국수
목요일 메뉴:삼겹살
{'월': '갈비탕', '화': '순대국', '수': '칼국수', '목': '삼겹살'}

 

 

 

enumerate()을 이용한 순회

  • 순서 값과 요소 값 둘을 한꺼번에 구해주는 내장함수
  • 리스트의 순서 값과 요소 값을 튜플로 묶는 컬렉션을 리턴한다.

 

yoil = ['월', '화', '수', '목', '금', '토', '일']
# enumerate()의 두 번째 인수로 시작값을 지정할 수 있다
for i, item in enumerate(yoil, 1):
    print(i, item)
1 월
2 화
3 수
4 목
5 금
6 토
7 일

 

color = ['빨강', '주황', '노랑', '초록', '파랑']
map_data = {v:i for i, v in enumerate(color)}
print(map_data)
{'빨강': 0, '주황': 1, '노랑': 2, '초록': 3, '파랑': 4}

 

 

 

[문제] 리스트 x와 y를 이용해 리스트 z와 같은 결과가 나오도록 하세요.
- x = [[1,2,3],[4,5,6]]
- y = [[11,12,13],[14,15,16]]
- z = [[12,14,16],[18,20,22]]
- Hint: list comprehension, zip()을 이용

x = [[1,2,3],[4,5,6]]
y = [[11,12,13],[14,15,16]]

print(list(zip(x,y)))

z = [[sum(c) for c in zip(a,b)] for a, b in zip(x,y)]
# c --> [(1,11), (2,12), (3,13)]
print(z)
[([1, 2, 3], [11, 12, 13]), ([4, 5, 6], [14, 15, 16])]
[[12, 14, 16], [18, 20, 22]]

 

 

 

[문제] 목표 날짜 구하기
- 사용자로부터 입력 받은 기준 날짜로부터 며칠이 경과된 목표 날짜를 계산하는 프로그램을 작성하세요.
    [예시]
    연도를 입력해 주세요: 2019
    월을 입력해 주세요: 2
    일을 입력해 주세요: 5
    며칠째 되는 날을 구하고 싶은가요? 10
    2019년 2월 5일로부터 10일째 되는 날은 2019년 2월 10일입니다.

from datetime import datetime, timedelta

year = int(input("연도를 입력해 주세요: "))
month = int(input("월을 입력해 주세요: "))
day = int(input("일을 입력해 주세요: "))
new_day = int(input("며칠째 되는 날을 구하고 싶은가요? "))

start_date = datetime(year, month, day)
target_date = start_date + timedelta(days=new_day)

print(f"{year}년 {month}월 {day}일로부터 {new_day}일째 되는 날은 {target_date.year}년 {target_date.month}월 {target_date.day}일입니다.")
연도를 입력해 주세요:  2023
월을 입력해 주세요:  10
일을 입력해 주세요:  23
며칠째 되는 날을 구하고 싶은가요?  10

2023년 10월 23일로부터 10일째 되는 날은 2023년 11월 2일입니다.

 

year = int(input('연도를 입력해 주세요: '))
month = int(input('월을 입력해 주세요: '))
day = int(input('일을 입력해 주세요: '))
new_day = int(input('며칠째 되는 날을 구하고 싶은가요? '))

for days in range(new_day):
    day += 1
    if (month == 4 or month == 6 or month == 9 or month == 11) and day > 30:
        day = 1
        month += 1
    elif month == 2:
        if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
            if day > 29:
                day = 1
                month += 1
        else:
            if day > 28:
                day = 1
                month += 1
    else:
        if day > 31:
            day = 1
            month += 1
    if month > 12:
        month = 1
        year += 1

print(f'{year}년 {month}월 {day}일로부터 {new_day}일째 되는 날은 {year}년 {month}월 {day}일입니다.')
연도를 입력해 주세요:  2023
월을 입력해 주세요:  12
일을 입력해 주세요:  20
며칠째 되는 날을 구하고 싶은가요?  20

2024년 1월 9일로부터 20일째 되는 날은 2024년 1월 9일입니다.

 

year = int(input('연도를 입력해 주세요: '))
month = int(input('월을 입력해 주세요: '))
day = int(input('일을 입력해주세요: '))
count = int(input('며칠째 되는 날을 구하고 싶은가요?'))
dayInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]

max_date = 0
passed = 0 # 지나간 일수를 위한 변수
if month == 2:
    max_date = 29 if (year % 4 == 0 and year % 100 !=0) or year % 400 ==0 else 28
else:
    max_date = dayInMonth[month-1]

if count <=  count - (max_date-day): #남은 일수보다 입력 받은 일수가 같거나 작으면 그냥 더해짐
    print(f'{count}일 후 의 날짜는 {year}년 {month}월은 {day+count}입니다')
else: # 무조건 달이 넘어간다는 소리임
    passed = count - (max_date-day)
    while(1):
        month += 1 
        if month == 2:
            max_date = 29 if (year % 4 == 0 and year % 100 !=0) or year % 400 ==0 else 28
        elif month > 12:
            year += 1
            month = 1
            max_date = dayInMonth[month -1]
        else:
            max_date = dayInMonth[month -1]
        if passed > max_date: 
            passed -= max_date
        else: 
            day = passed
            break
    
    print(f'{count}일 후 의 날짜는 {year}년 {month}월은 {day}입니다')
연도를 입력해 주세요:  2023
월을 입력해 주세요:  12
일을 입력해주세요:  20
며칠째 되는 날을 구하고 싶은가요? 20

20일 후 의 날짜는 2024년 1월은 9입니다

'프로그래밍 언어 > Python' 카테고리의 다른 글

[Python] Collection - Set  (1) 2023.10.27
[Python] Comprehension (List, Dictionary, Set)  (0) 2023.10.27
[Python] 함수  (0) 2023.10.26
[Python] 매개변수  (0) 2023.10.26
[Python] Filter, Map, Reduce  (1) 2023.10.26