ABC 부트캠프/python

3일차 - python 리스트, 튜플, 딕셔너리

멋진단지 2023. 3. 16. 15:54

리스트란?

- 여러 개의 데이터를 하나의 변수에 담을 수 있는 데이터 구조

- [ ] 대괄호 사용 

 

score = [90, 89, 77, 95, 67]

fruit = ["apple", "banana", "orange"]

"""
리스트 생성
"""

# 1) []을 이용하여 리스트 생성 -> 값을 직접 넣어서 생성
list1 = [3, 15, -12.5, "사과", "딸기" ]
print(list1)

# 2) list() 함수로 리스트 생성
list2 = list(range(1, 21, 2))
print(list2)

리스트는 데이터 형식 상관없이 숫자, 문자 형식의 정보를 한 곳에 저장 가능.

 

"""
리스트에서 요소 추출
"""

color = ["빨강", "주황", "노랑", "초록", "파랑", "남색", "보라"]

print(color[0])
# 출력: 빨강

print(color[6])
print(color[-1])
# 출력: 보라
#	보라

print(color[2:5])
print(color[-5:5])
# 출력: ['노랑', '초록', '파랑']
#	['노랑', '초록', '파랑']

print(color[4:])
print(color[-3:])
# 출력: ['파랑', '남색', '보라']
#	['파랑', '남색', '보라']

 

리스트의 마지막 데이터를 가져오고 싶을 때

리스트 인덱스를 -1 해주면

뒷 데이터를 가져와줌!

 

               -1         -2        -3         -4        -5         -6         -7

color = ["빨강", "주황", "노랑", "초록", "파랑", "남색", "보라"]

                0          1          2          3         4          5          6

color2 = ["빨강", "주황", "노랑", "초록", "파랑", "남색", "보라", "무지개"]

print(color2[4:])
print(color2[-3:])

# 출력: ['파랑', '남색', '보라', '무지개']
#	['남색', '보라', '무지개']

-1, -2 ... 인덱스를 사용하는 이유는

뒤에서 두 번째 정보를 추출하고 싶을 때

color[5]으로 출력할 수 있지만

list 정보가 늘어나게 되면

color[6]로 바뀌기 때문에

 

→ color[-2] 로 사용하면 논리적 오류가 나지 않음!

 

 

 

 

 

for문에서 리스트를 사용

"""
for에서 리스트 사용
"""

colors = ["빨강", "주황", "노랑", "초록", "파랑", "남색", "보라"]

# 리스트를 사용한 for (요소 추출)
for color in colors:
    print("나는 %s을 좋아한다." % color)

print()

# index를 사용한 for (요소 추출)
for i in range(0, len(colors)):
     print("나는 %s을 좋아한다." % colors[i])
     
"""
출력: 
나는 빨강을 좋아한다.
나는 주황을 좋아한다.
나는 노랑을 좋아한다.
나는 초록을 좋아한다.
나는 파랑을 좋아한다.
나는 남색을 좋아한다.
나는 보라을 좋아한다.
"""

첫 번째 리스트를 사용한 for문은

값만 가져오기 때문에 colors[1], colors[3] ... 이런식으로 내가 원하는 인덱스만 가져올 수 없음.

 

index를 사용한 for문은 내가 원하는 인덱스를 사용할 수 있음.

ex) list 중 홀수 인덱스만 가져오기, 짝수 인덱스만 가져오기

 

 

 

 

 

 

while문에서 리스트 사용

"""
while문에서 리스트 사용
"""

animals = ["코끼리", "호랑이", "사슴", "펭귄", "여우"]

i = 0

while i < len(animals):
    print(animals[i])

    i = i + 1

while문에서 리스트를 가져오는 것도 가능하나

무조건 써야 하는 상황이 아니면 비추

 

 

 

 

 

리스트 요소 수정 및 추가

"""
리스트 요소 수정 및 추가
"""

flowers = ["목련", "벚꽃", "장미", "백일홍"]
print(flowers)

# 벚꽃 -> 무궁화로 변경
# 리스트명[인덱스] = 데이터
flowers[1] = "무궁화"
print(flowers)

# 리스트에 안개꽃을 추가
# flowers[4] = "안개꽃"
# error

flowers.append("안개꽃")
print(flowers)

list의 요소를 추가할 때

list[index] = "요소"로 넣으면 에러가 뜬다.

list의 공간은 4번째 방밖에 없는데 5번째 방에 데이터를 넣으려고 해서!

 

요소를 추가하기 위해서는

리스트명.append("요소") 

 

 

 

 

 

리스트 중간에 요소 삽입 및 위치 찾기

"""
리스트 요소 삽입 및 위치 찾기
"""

flowers = ["목련", "벚꽃", "장미", "백일홍"]
print(flowers)

# 벚꽃 위치에 무궁화 삽입 대신에 기존 데이터 유지
# 리스트명.insert(인덱스, 데이터)
flowers.insert(1, "무궁화")
print(flowers)
# 출력: ['목련', '무궁화', '벚꽃', '장미', '백일홍']


# index 위치를 찾기
# 리스트명.index(데이터)
print(flowers.index("벚꽃"))
# 출력: 2

# 벚꽃 위치에 안개꽃 삽입 대신에 기존 데이터 유지
flowers.insert(flowers.index("벚꽃"), "안개꽃")
print(flowers)
# 출력: ['목련', '무궁화', '안개꽃', '벚꽃', '장미', '백일홍']

기존 데이터를 유지하면서 "벚꽃" 위치에 무궁화를 삽입하고 싶다면

list.insert(인덱스, "요소")

 

"벚꽃" 요소에 index 위치를 찾기 위해서는

list.index("요소")

 

list를 쓸 때 요소는 알지만 인덱스 번호를 모를 때는

→ list.index로 요소 번호를 찾고 그 자리에 insert를 해준다!

 

 

 

 

 

리스트 요소 삭제

"""
리스트 요소 삭제
"""

flowers = ['목련', '무궁화', '안개꽃', '벚꽃', '장미', '백일홍']

# 특정 요소를 삭제 -> 리스트.remove(데이터)
# 안개꽃 삭제
flowers.remove("안개꽃")
print(flowers)
# 출력: ['목련', '무궁화', '벚꽃', '장미', '백일홍']


# 특정 요소를 삭제 -> 삭제할 정보를 사용할 경우
# 리스트.pop(인덱스)
# flowers 리스트에서 벚꽃을 삭제하고 flower 변수에 담기

flower = flowers.pop(flowers.index("벚꽃"))
print(flowers)
# 출력: ['목련', '무궁화', '벚꽃', '장미', '백일홍']

# 리스트에 모든 요소를 삭제
flowers.clear()
print(flowers)

리스트에 특정 요소를 삭제하고 싶을 때 

list.remove("요소")

 

리스트에 특정 요소를 삭제하고 삭제할 정보를 사용할 경우

list.pop(인덱스)

 

리스트에 모든 요소 삭제

list.clear()

 

 

리스트 병합

"""
리스트 병합
"""

person1 = ["kim", 24, "kim@naver.com"]
person2 = ["lee", 35, "lee@hanmail.net"]

person = person1 + person2

print(person)

# 출력: ['kim', 24, 'kim@naver.com', 'lee', 35, 'lee@hanmail.net']

리스트 2개를 1개 리스트로 합치고 싶을 때는 + 연산자만 쓰면 된다!

 

 

 

 

 

 

리스트 합계, 평균 구하기

"""
리스트 합계, 평균 구하기
"""

scores = [80, 90, 85, 95, 100]

sm = sum(scores)

print("합계: ", sm)
print("평균: ", sm/len(scores))

# 출력: 합계:  450
#	평균:  90.0

파이썬은 for문을 쓰지 않아도 내장 함수 sum으로 합계를 구할 수 있음.

 

리스트 내장 함수

 

 

 

 

+ 리스트에서 제공하는 함수

리스트 메소드

"""
리스트에서 제공하는 함수 예제
"""

# 1) 리스트 요소를 반대로 출력
# 리스트명.reverse()
data = [10, 20, 30, 40, 50]
print(data)

data.reverse()
print(data)

# 2) 리스트 복사하기
# 리스트명.copy()
flowers = ["목련", "벚꽃", "장미" ]
flowers1 = flowers.copy()
print(flowers1)

# 3) 리스트 정렬하기
# 리스트명.sort() -> 기본값: 오름차순 정렬
data = [12, 8, 15, 32, -3, -20, 15, 34, 6]
print(data)
data.sort()
print(data)

# 내림차순(큰 것부터 나옴, 최신 날짜순)
# 리스트명.sort(reverse=True)
data.sort(reverse=True)
print(data)

 

 

 

 

 

문자열 메소드

"""
문자열에서 제공하는 메소드 예제
"""

# 1) find()
# 문자열.find(찾을 문자) -> 찾은 문자의 위치
string1 = "Python is fun!"
print(string1)
print(string1.find("fun"))
print(string1.find("funny")) # 찾는 문자가 없으면 -1

# 출력: Python is fun!
#	10
#	-1



# 2) 문자열 치환하기 replace(기본데이터, 치환할 데이터)
# 하이픈을 제거한 핸드폰 번호를 출력
phone = "010-1234-5678"
print(phone)

phone1 = phone.replace("-", "")
print(phone1)

# 출력: 010-1234-5678
#	01012345678



# 3) 문자열 분리하기 split(특정문자) -> 리스트로 반환
hello = "have a nice day"
print(hello)

list1 = hello.split( )
print(list1)
print(type(list1))

for l in list1:
    print(l)

"""
출력: have a nice day
['have', 'a', 'nice', 'day']
<class 'list'>
have
a
nice
day
"""

# 4) 리스트를 문자열로 변환 문자열_분리기준.join(리스트)
text = ""
for l in list1:
    text = text + " " + l

print(text)
# 출력:  have a nice day

#join 함수 활용
text = " ".join(list1)
print(text)
# 출력: have a nice day

# 하이픈이 포함된 휴대폰 번호
phone = "010-1234-5678"
print(phone)
# 출력: 010-1234-5678

# 하이픈 기준으로 분리된 휴대폰 번호
phone1 = phone.split("-")
print(phone1)
# 출력: ['010', '1234', '5678']

# 하이픈 기준으로 연결한 휴대폰 번호
phone2 = "-".join(phone1)
print(phone2)
# 출력: 010-1234-5678

문자열 메소드

 

 

 

2차원 리스트의 구조

"""
2차원 리스트 구조
"""

numbers = [[10, 20, 30], [40, 50, 60, 70]]

print(numbers[0][0])
print(numbers[1][0])
print()
print(len(numbers[0])) # 1차원
print(len(numbers[1])) # 2차원
print()
print(sum(numbers[0])) # 1차원
print(sum(numbers[1])) # 2차원

 

 

 

 

이중 for문으로 2차원 리스트 요소 추출

numbers = [[10, 20, 30], [40, 50, 60, 70]]

# 2차원 리스트 for문 사용
for i in range(len(numbers)):
    for j in range(len(numbers[i])):
        print("numbers[%d][%d] = %d" % (i, j, numbers[i][j]))

 


다섯 명의 학생에 대한 세 과목 성적의 합계와 평균을 구하는 프로그램

"""
다섯 명의 학생에 대한 세 과목 성적의 합계와 평균을 구하는 프로그램
"""

scores = [[75, 83, 90], [86, 86, 73], [76, 95, 83], [89, 96, 69], [89, 76, 93]]

for i in range(len(scores)):
    sm = 0
    for j in range(len(scores[i])):
        sm = sm + scores[i][j]

    # 평균
    avg = sm / len(scores[i])
    print("%d번째 학생의 합계: %d, 평균: %.2f" % (i+1, sm, avg))
    
"""
출력:
1번째 학생의 합계: 248, 평균: 82.67
2번째 학생의 합계: 245, 평균: 81.67
3번째 학생의 합계: 254, 평균: 84.67
4번째 학생의 합계: 254, 평균: 84.67
5번째 학생의 합계: 258, 평균: 86.00
"""

 

 

 

이중 for문을 사용하지 않고 합계와 평균을 구하기

# 2중 for문을 사용하지 않고 합계와 평균을 구하기

for i in range(len(scores)):
    sm = 0
    sm = sum(scores[i])
    avg = sm / len(scores[i])

    print("%d번째 학생의 합계: %d, 평균: %.2f" % (i+1, sm, avg))
    
"""
출력
1번째 학생의 합계: 248, 평균: 82.67
2번째 학생의 합계: 245, 평균: 81.67
3번째 학생의 합계: 254, 평균: 84.67
4번째 학생의 합계: 254, 평균: 84.67
5번째 학생의 합계: 258, 평균: 86.00
"""

 


튜플이란?

- 튜플에서는 리스트의 대괄호([ ]) 대신에 소괄호 (( ))를 사용.

- 튜플에서는 리스트와는 달리 요소의 수정과 추가가 불가능함.

 

"""
튜플 생성
"""

animals = ("토끼", "거북이", "사자", "여우")
print(animals)
print(animals[0])

# 출력: ('토끼', '거북이', '사자', '여우')
#	토끼

# animals[0] = "호랑이"
# error

튜플은 데이터를 지정하면 수정할 수 없음!

 

 

 

 

튜플의 병합

tup1 = tuple(range(10, 51, 10))
tup2 = tuple(range(100, 151, 10))

# 튜플 병합
tup = tup1 + tup2
print(tup)

 

 


딕셔너리란?

- 리스트와는 다른 방법으로 추출

- key, value 형태로 되어있음.

딕셔너리 구조

"""
딕셔너리 생성 및 요소 추출
"""

# 딕셔너리 생성
member = {"name":"황예린", "age":22, "email":"yerin@hanmail.net"}
print(member)
# 출력: {'name': '황예린', 'age': 22, 'email': 'yerin@hanmail.net'}

score = dict([("국어", 80), ("영어", 90), ("수학", 100)])
print(score)
# 출력: {'국어': 80, '영어': 90, '수학': 100}


# 딕셔너리 요소 추출
# 딕셔너리명[key] -> value 요소가 추출됨
print(member["name"])
print(member["email"])
print(score["국어"])
print(score["수학"])

"""
출력
황예린
yerin@hanmail.net
80
100
"""

 

 

 

 

 

딕셔너리 요소 추가

score = dict([("국어", 80), ("영어", 90), ("수학", 100)])
print(score)

# 딕셔너리 요소 추가
# score 딕셔너리에 음악 점수 100점 추가
score["음악"] = 100
score["국어"] = 100
print(score)

딕셔너리명[key[ = 값 → 키가 없으면 새로 등록, 있으면 값이 수정됨.

 

 

 

 

 

딕셔너리 요소 삭제

score = dict([("국어", 80), ("영어", 90), ("수학", 100)])

# 딕셔너리 요소 삭제
# 음악 점수 삭제
# 딕셔너리명.pop(키)
x = score.pop("음악")
print(score)
print(x)

# 출력: {'국어': 100, '영어': 90, '수학': 100}
#	100


# 딕셔너리 전체 삭제
# 딕셔너리명.clear()
score.clear()
print(score)

 

 

 

 

for문에 딕셔너리 사용

# 딕셔너리 생성
member = {"name":"황예린", "age":22, "email":"yerin@hanmail.net"}
print(member)

# 딕셔너리를 for문에 사용하면 key값을 return
for key in member:
    print(key, ":", member[key])

딕셔너리를 for문에 넣으면 key 값을 반환해줌!

 

 

 

 

for문을 사용하지 않고 딕셔너리의 총합과 평균 구하기

# for문을 사용하지 않고 딕셔너리의 총합과 평균 구하기

scores = {"김채린": 85, "박수정": 98, "함소희": 94, "안예린": 90, "연수진": 93}


print(scores.values())

sm = sum(scores.values())
avg = sm / len(scores)
print("합계: %d, 평균: %.2f" % (sm, avg))

list.values() → 딕셔너리 value의 총 합계를 구할 수 있음.

 


딕셔너리를 이용하여 영어 단어 퀴즈를 만드는 프로그램

"""
딕셔너리를 이용하여 영어 단어 퀴즈를 만드는 프로그램
"""
words = {"꽃": "flower", "나비": "butterfly", "학교": "school", "자동차": "car", "비행기": "airplane"}

print("<영어 단어 맞추기 퀴즈>")

for kor in words:
    input_word = input("'%s'에 해당되는 영어 단어를 입력해주세요: " % kor)

    if words[kor] == input_word:
        print("정답입니다!")
    else:
        print("틀렸습니다!")

 

 

 

 

 

주중 최저 기온을 가지는 요일과 최저 기온을 출력

"""
딕셔너리 temp에서 주중 최저 기온을 가지는 요일과
최저 기온을 실행결과와 같이 출력하는 프로그램
"""

temp = {"월": 15.5, "화": 17.0, "수": 16.2, "목": 12.9, "금": 11.0, \
        "토": 10.5, "일": 13.3}

c = temp["월"]
day = "월"

for key in temp:
    if temp[key] < c:
        c = temp[key]
        day = key

print("요일: %s, 최저 기온: %.1f" % (day, c))


# list comprehension (리스트 컴프리헨션)
# [(변수를 이용한 값) for (사용할 변수 이름) in (순회할 수 있는 값) if (조건)]
c = min(temp.values())
day = [k for k, v in temp.items() if v == c][0]

print("요일: %s, 최저 기온: %.1f" % (day, c))

"""
for문을 돌면서 temp.item()에 key값과 value 값을 나오게 함.
"""

 

 

 

list comprehension (리스트 컴프리헨션)

- '리스트 컴프리헨션'은 리스트를 간단하게 한 줄로 만들 수 있는 파이썬의 문법

 

[ (변수를 이용한 값) for (사용할 변수 이름) in (순회할 수 있는 값) if (조건) ]