본문 바로가기

Python/for Beginner

[Python] 리스트 [] , 튜플 () , 딕셔너리 {} 비교

728x90
반응형

1. 리스트

리스트명 = [값1, 값2, ... ] 

- 다양한 데이터형을 섞어 생성할 수 있음

 

1) 리스트[첨자] 형식으로 접근

  • 맨 앞에서는 0으로 시작
  • 맨 뒤에서는 -1로 시작
  • 콜론(:)을 사용해 범위 지정(콜론의 앞이나 뒤 숫자를 생략가능) -> 리스트명[시작값:끝값+1]

ex)

aa = [] 
for i in range(0, 4) : # 초기화 작업 -> 우선, 모든 원소 값을 0으로 채우기
    aa.append(0)
hap = 0

for i in range(0, 4) : # 원소 입력
    aa[i] = int(input(str(i + 1) + "번째 숫자 : "))

for i in range(0, 4) : # 원소의 합
    hap = hap + aa[i]
print("합계==>%d" % hap)

[실행결과]

1번째 숫자 : 10
2번째 숫자 : 20
3번째 숫자 : 30
4번째 숫자 : 40
합계==>100

 

- 덧셈 연산 : 요소들이 합쳐져 결과르 리스트가 하나가 됨

- 곱셈 연산 : 항목들이 횟수만큼 반복해서 출력됨

aa = [10, 20, 30] 
bb = [40, 50, 60]
print(aa + bb) # 덧셈
print(aa * 3) # 곱셈

[실행결과]

[10, 20, 30, 40, 50, 60]
[10, 20, 30, 10, 20, 30, 10, 20, 30]

- aa[::2] : 에서부터 2칸씩 건너뛰기 (+ 방향)

- aa[::-2] : 에서부터 2칸씩 건너뛰기 (- 방향)

 

2) 리스트 값 변경

 

ex 1)

aa = [10, 20, 30]
aa[1:2] = [200, 201] # 즉 두 번째인 aa[1]의 위치를 [200, 201]로 교체
print(aa)

[실행결과]      [10, 200, 201, 30]

 

ex 2)

aa = [10, 20, 30]
aa[1] = [200, 201] # aa[1:2] 대신 적용
print(aa)

[실행결과]        [10, [200, 201], 30]

 

3) 리스트의 항목 삭제

 

ex 1) del() 함수 사용

aa = [10, 20, 30]
del(aa[1])
print(aa)

[실행결과] [10, 30]

 

ex 2) 항목을 여러 개 삭제 -> aa[시작값:끝값+1]=[] 

aa = [10, 20, 30, 40, 50]
aa[1:4] = []
print(aa)

[실행결과] [10, 50]

 

ex 3) 리스트 자체를 삭제

aa = [10, 20, 30] ; aa = []; print(aa) # 리스트 내용르 모두 삭제 -> 빈 리스트
aa = [10, 20, 30] ; aa = None; print(aa) # aa를 빈 변수로 만들기
aa = [10, 20, 30] ; del(aa); print(aa) # aa변수를 삭제

[실행결과]

[]
None (아무것도 안 나옴)
오류 발생

 

4) 리스트 조작 함수

append() 리스트 맨 뒤에 항목 추가 리스트명.append(값)
pop() 리스트 맨 뒤의 항목 빼기 (리스트에서 해당 항목이 삭제됨) 리스트명.pop()
sort() 리스트의 항목 정렬 리스트명. sort()
reverse() 리스트 항목의 순서를 역순 정렬 리스트명.reverse()
index() 지정한 값을 찾아 해당 위치 반환 리스트명.index(찾을값)
insert() 지정된 위치에 값을 삽입 리스트명.insert(위치, 값)
remove() 리스트에서 지정한 값을 삭제 (지정한 값이 여러 개면 첫 번째 값만 지움) 리스트명.remove(지울값)
extend() 리스트 뒤에 리스트를 추가 (더하기 + 연산과 기능이 동일) 리스트명.extend(추가할리스트)
count() 리스트에서 해당 값의 개수를 셈 리스트명.count(찾을값)
clear() 리스트의 내용을 모두 지움 리스트명.clear()
del() 리스트에서 해당 위치의 항목을 삭제 del(리스트명[위치])
len() 리스트에 포함된 전체 항목의 개수 len(리스트명)
copy() 리스트의 내용을 새로운 리스트에 복사 새리스트=리스트명.copy()
sorted() 리스트의 항목을 정렬해서 새로운 리스트에 대입 새리스트=sorted(리스트)

 

myList = [30, 10, 20]
print("현재 리스트 : %s" % myList)

myList.append(40) # 맨 뒤에 항목 추가
print("append(40) 후의 리스트 : %s" % myList)

print("pop()으로 추출한 값 : %s" % myList.pop()) # 맨 뒤의 항목을 빼냄
print("pop() 후의 리스트 : %s" % myList)

myList.sort() # 항목 정렬
print("sort() 후의 리스트 : %s" % myList) 

myList.reverse() # 순서를 역순으로 정렬
print("reverse() 후의 리스트 : %s" % myList)

print("20값의 위치 : %d" % myList.index(20)) # 해당 위치 반환

myList.insert(2, 222) # index 2위치에 222 삽입
print("insert(2, 222) 후의 리스트 : %s" % myList)

myList.remove(222) # 지정한 값 삭제
print("remove(222) 후의 리스트 : %s" % myList)

myList.extend([77, 88, 777]) # 리스트 뒤에 리스트를 추가
print("extend([77, 88, 777]) 후의 리스트 : %s" % myList)

print("77값의 개수 : %d" % myList.count(77)) # 해당값의 개수를 나타냄

[실행결과] 

현재 리스트 : [30, 10, 20]
append(40) 후의 리스트 : [30, 10, 20, 40]
pop()으로 추출한 값 : 40
pop() 후의 리스트 : [30, 10, 20]
sort() 후의 리스트 : [10, 20, 30]
reverse() 후의 리스트 : [30, 20, 10]
20값의 위치 : 1
insert(2, 222) 후의 리스트 : [30, 20, 222, 10]
remove(222) 후의 리스트 : [30, 20, 10]
extend([77, 88, 777]) 후의 리스트 : [30, 20, 10, 77, 88, 777]
77값의 개수 : 1

 

5) 2차원 리스트

 

ex) 3행 4열의 2차원 리스트 생성

list1 = []
list2 = []
value = 1

for i in range(0, 3) :
    for j in range(0, 4) :
        list1.append(value) # 항목이 4개인 1차원 리스트 생성
        value += 1
    list2.append(list1) # 만든 리스트를 2차원 리스트에 추가
    list1 = [] # 빈 리스트로 초기화

for i in range(0, 3) :
    for j in range(0, 4) :
        print("%3d" % list2[i][j], end =" ") # 행 넘기지 않고 띄어쓰기로 출력하도록 설정
    print("")

[실행결과] 

   1   2   3   4
   5   6   7   8
   9   10 11 12

 

2. 튜플

값이 여러 개 -> 튜플명 = (값1, 값2, 값3 ...) or 값1, 값2, 값3
값이 하나 -> 튜플명 = (값, )

 

1) 생성

- 튜플은 읽기 전용이므로 다음 코드는 모두 오류 발생

tt1.append(40)
tt1[0] = 40
del(tt1[0])

- 튜플 자체를 삭제할 경우 -> del() 함수 이용   ex) del(tt1)

 

2) 사용

- 튜플 항목에 접근 : 튜플명[위치]        ex) tt1[0]

- 튜플 범위에 접근 : (시작값:끝값+1) (리스트와 동일)

- 덧셈 및 곱셈 연산도 가능

- 튜플의 항목을 변경하려면 먼저 튜플을 리스트로 변환해 항목을 변경 -> 다시 튜플로 변환

 

myTuple = (10, 20, 30)
myList = list(myTuple) # 튜플을 리스트로 변환
myList.append(40) # 항목 변경
myTuple = tuple(myList) # 다시 리스트를 튜플로 변환
print(myTuple)

[실행결과]  (10, 20, 30, 40)

 

 

3. 딕셔너리

Dictionary : 쌍 2개가 하나로 묶인 자료구조, 중괄호 { }로 묶어 구성하며, 키(Key)와 값(Value)의 쌍으로 구성
딕셔너리변수 = {키1:값1, 키2:값2, 키3:값3, ...}

 

1) 생성

- 딕셔너리명[키]=값 형식으로 쌍을 추가할 수 있음

- 순서가 없음 (키를 사용해 추출하기 때문에 순서가 필요 X)

- 이미 존재하는 키를 사용하려면 새로운 쌍이 추가되는 것이 아니라 기존값이 변경됨 -> 키는 유일해야 하기 때문

student1 = {'학번' : 1000, '이름' : '홍길동', '학과' : '컴퓨터학과'}
student1['연락처'] = '010-1111-2222' # 쌍 추가
print(student1)
del(student1['학과']) # 쌍 삭제
print(student1)

[실행결과] 

{'학번': 1000, '이름': '홍길동', '학과': '컴퓨터학과', '연락처': '010-1111-2222'}
{'학번': 1000, '이름': '홍길동', '연락처': '010-1111-2222'}

 

2) 사용

- 키를 이용해 값을 구함  ex) student1['학번']

- 딕셔너리명.get(키) 함수를 사용하여 접근

-> 딕셔너리명[키]와 딕셔너리명.get(키)의 결과는 동일

student1['주소']

student1.get('주소')

 

- 딕셔너리의 모든 키 반환 : 딕셔너리명.keys()

- 딕셔너리의 모든 값 반환 : 딕셔너리명.values()

student1 = {'학번' : 1000, '이름' : '홍길동', '학과' : '컴퓨터학과'}

print(student1.keys()) # 모든 키 반환
print(list(student1.keys())) # dict_keys() 보기 싫을 경우
print(student1.values())
print(list(student1.values())) # dict_values() 보기 싫을 경우
print(student1.items()) # 튜플 형태로 출력

[실행결과] 

dict_keys(['학번', '이름', '학과'])
['학번', '이름', '학과']
dict_values([1000, '홍길동', '컴퓨터학과'])
[1000, '홍길동', '컴퓨터학과']
dict_items([('학번', 1000), ('이름', '홍길동'), ('학과', '컴퓨터학과')])

 

- 딕셔너리 안에 해당 키가 있는지 없는지 in을 사용하여 확인 -> 키가 있다면 True 반환, 없다면 False 반환

ex) '이름' in student1

 

ex) for문을 활용해 딕셔너리의 모든 값을 출력

singer = {}
singer['이름'] = '트와이스'
singer['구성원 수'] = 9
singer['데뷔'] = '식스틴'
singer['대표곡'] = 'signal'

for i in singer.keys() : # key 개수만큼 반복
    print("%s --> %s" % (i, singer[i]))

[실행결과] 

이름 --> 트와이스
구성원 수 --> 9
데뷔 --> 식스틴
대표곡 --> signal

 

3) 정렬

: 키로 정렬하면 각 결과는 튜플로 변경되며 리스트로 반환

 

ex 1)

import operator # itemgetter() 함수를 사용하기 위해 임포트

trainDic, trainList = {}, [] # 빈 딕셔너리와 리스트 준비
trainDic = {'Thomas' : '토마스', 'Edward' : '에드워드', 'Henry' : '헨리', 'Gothen' : '고든', 'James' : '제임스'}
trainList = sorted(trainDic.items(), key=operator.itemgetter(0)) # key를 기준으로 딕셔너리 정렬하여 빈 리스트에 대입
print(trainList)
trainList = sorted(trainDic.items(), key=operator.itemgetter(1)) # value를 기준으로 딕셔너리 정렬하여 빈 리스트에 대입
print(trainList)
  • 로 정렬하려면 -> operator.itemgetter(0)로 변경
  • 으로 정렬하려면 -> operator.itemgetter(1)로 변경

 

[실행결과] 리스트 안에 튜플로 딕셔너리 항목이 변경됨

[('Edward', '에드워드'), ('Gothen', '고든'), ('Henry', '헨리'), ('James', '제임스'), ('Thomas', '토마스')]
[('Gothen', '고든'), ('Edward', '에드워드'), ('James', '제임스'), ('Thomas', '토마스'), ('Henry', '헨리')]

 

 ex 2) 딕셔너리를 활용해 음식 궁합 출력

foods = {"떡볶이" : "오뎅",
        "짜장면" : "단무지",
        "라면" : "김치",
        "피자" : "피클",
        "맥주" : "땅콩",
        "치킨" : "치킨무",
        "삼겹살" : "상추"}

while (True) :
    myfood = input(str(list(foods.keys())) + " 중 좋아하는 음식은? ")
    if myfood in foods : # 입력한 값이 딕셔너리에 있다면
        print("<%s> 궁합 음식은 <%s>입니다." % (myfood, foods.get(myfood))) # 키를 이용하여 값을 출력
    elif myfood == "끝" :
        break
    else :
        print("그런 음식이 없습니다.")

[실행결과]

['떡볶이', '짜장면', '라면', '피자', '맥주', '치킨', '삼겹살'] 중 좋아하는 음식은? 피자
<피자> 궁합 음식은 <피클>입니다.
['떡볶이', '짜장면', '라면', '피자', '맥주', '치킨', '삼겹살'] 중 좋아하는 음식은? 마라탕
그런 음식이 없습니다.
['떡볶이', '짜장면', '라면', '피자', '맥주', '치킨', '삼겹살'] 중 좋아하는 음식은? 끝

 

 

 

출처: 파이썬 for Beginner (우재남 지음, 한빛아카데미)

728x90
반응형