본문 바로가기
컴퓨터 프로그래밍/python

Python 리스트(list) & 튜플(tuple)

by JaeBaek 2020. 8. 12.

■ 리스트

★ 자료의 집합

 하나의 값을 저장하는 개별 변수와는 다르게 여러 개의 값을 집합적으로 저장을 할 수 있습니다. 이는 다른 언어에서의 배열과 같은 개념이라고 생각하시면 편하겠습니다. 

 예를들어 한 학생의 평균점수를 구한다고 가정을 해 보겠습니다. 성적이 저장된 리스트를 for문으로 순화하며 각 학생의 성적을 꺼내 더하면 총점을 쉽게 구할 수 있는 것을 알 수가 있습니다. 하지만 성적이 list가 아닌 개별로 되어있다고 한다면 이는 별개의 변수이기 때문에 일일이 더해야 하며 루프를 돌릴 수 없어 반복 처리가 불가능합니다. 

 또한 빈 리스트 list( ) 는 미리 만들어두고 실행중에 추가를 할 수 있으며, 튜플과 같은 다른 타입을 리스트로 변환시킬 때에도 사용이 됩니다. 

 

총점, 평균 구하기

score=[94,88,100,97,93]

sum=0

for s in score:

    sum+=s

ave=sum/len(score)

print("total : %d" %sum)

print("average : %d " %ave)

result

total : 472
average : 94

 

★ 리스트의 요소

리스트의 요소도 문자열을 관리했을 때와 비슷하게 첫 번째요소가 [0]번 입니다.. 그리고 마지막 요소는 [-1]입니다.

cf.

 

 list 요소

num=[1,2,3,4,5,6,7,8,9,10]

print(num[0:4])

print(num[-1::-1])

print(num[2:5])

print(num[1:7:2])

result

[1, 2, 3, 4]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[3, 4, 5]
[2, 4, 6]

 

그리고 문자열에서는 한번 정의를 내리면 변경이 불가능했던 반면 리스트(list) 에서는 변경을 할 수 있다는 큰 차이점이 있습니다. 또한 리스트끼리 더해서 확장시킬 수 있습니다. ( 행렬의 확장이라 생각하시면 되겠습니다. )

 

 

 list 변경

num=[1,2,3,4,5]

num[3]=9

print(num[3])

# answer = 9

 

list 변경 - 범위

num=[1,2,3,4,5,6,7,8,9,10,11,12]

num[5:9]=[11,12,13,14,15]

print(num)

# answer : [1, 2, 3, 4, 5, 11, 12, 13, 14, 15, 10, 11, 12]



list 확장

num1=[1,2,3,4]

num2=[5,6,7,8]

num1+=num2

print(num1)

# answer : [1, 2, 3, 4, 5, 6, 7, 8]

 

★ 이중 리스트

 

생물을 동물과 식물로 나누고 더 세분화 하듯이 어떤 리스트들의 집단을 하나로 묶는 것을 이중 리스트라고 합니다. 이중 리스트를 하는 방법은 각 리스트들을 나열하고 [ ] 대괄호로 묶어주면 이중 리스트가 만들어집니다.  

big=[[1,2,3],[4,5,6,7,8],[9,10,11,12]] 이러한 이중행렬이 있다고 가정해보겠습니다. 

 이중 리스트는 다음과 같습니다. 여기서 보기에 직관적으로 big[2][2]의 위치는 어디일 것 같으신가요? 네 11입니다. 행렬을 나타낼 때 처럼 각 행과 열에 -1씩 해주면 이해하기 쉬울 것 같습니다. 다만 직사각형 형태가 아닌 행렬인게 문제지만 간단한 방법인거 같습니다. 

 

 이렇게 이중 리스트로 되어있을 때에도 for 문으로 만들 수 있습니다.

for small in big :

    for tiny in small :

 

 이 코드가 뜻하는 것은 big이라는 큰 이중 리스트에서 small이라는 리스트를 선회한다. 즉 각 행을 반복한다고 생각하면 될 것 같습니다. 그리고 내부 for 문에서 small은 각각의 행 즉, big[0], big[1], big[2]가 각각 서로를 개별요소들을 지나간다고 생각하면 되겠네요. 내부 for문은 각 행을 고정시킨다음 열을 지나간다고 생각하면 될 것 같습니다. 

 

 

여러 학생들의 성적 산출

score=[[76,88,92,98],[65,70,58,82],[82,80,78,88]]

total=0

totalsub=0

for student in score:

    sum=0

    for subject in student:

        sum+=subject

    subject=len(student)

    print("총점 %d, 평균 %.2f" %(sum,sum/subject))

    total+=sum

    totalsub+=subject

print("전체평균 %.2f" %(total/totalsub))

result

총점 354, 평균 88.50
총점 275, 평균 68.75
총점 328, 평균 82.00
전체평균 79.75

 

■ 리스트 관리

★ 삽입

처음에 말했듯이 list는 변경이 가능합니다. 따라서 삽입을 하거나 삭제를 하거나 할 수 있습니다. 

 

append : 전달 받은 인수를 리스트 요소의 끝에 덧붙여 추가를 하는 기능입니다.

insert : append와는 다르게 전달 받은 인수를 리스트의 중간에 삽입을 하는 기능입니다.

 

append, list 기본적인 기능

num=[1,2,3,4,5]

num.append(6)

num.insert(3,50)

print(num)

# answer : [1, 2, 3, 50, 4, 5, 6]

 

extend : 두개의 서로 다른 리스트를 확장하여 하나의 리스트로 만듭니다.

extend

num=[1,2,3]

num2=[4,5,6]

num.extend(num2)

print(num)

# answer : [1, 2, 3, 4, 5, 6]

 

 

행렬 확장

행렬 확장

num=[1,2,3,4,5,6]

num[2:2]=[10,11,12]

print(num) 

# [2:2] 범위에 3개의 요소를 대입한다는 뜻으로 사실상 0이지만 삽입할 위치를 알려주는 셈

 

nu=[1,2,3,4,5,6]

nu[2]=[10,11,12]

print(nu)

# 하나의 위치를 지정시켜버린 것으로서 이중 리스트가 만들어 지게 된다.

result

[1, 2, 10, 11, 12, 3, 4, 5, 6]
[1, 2, [10, 11, 12], 4, 5, 6]

 

★ 삭제

remove : 인수로 전달받은 요소값을 찾아 삭제하는 기능입니다.

del : 순서값을 지정하여 삭제하고, 할당의 반대 동작을 수행합니다. 주의 할점은 del은 파이썬 키워드이기 때문에 변수.del[ ] 으로 호출을 하면 안됩니다.

pop : 삭제한 요소를 꺼내 반환하는 기능을 가지고 있습니다. 

remove, del, pop

num=[1,2,3,4,5,6,7,8,9,10]

num.remove(8)

print(num)

del(num[3])

print(num)

num[1:4]=[]

print(num)

print(num.pop()) # 빼낸 인수를 출력할 것임. 즉, 10

print(num.pop(1)) # 1번째 이므로 즉, 6

result

[1, 2, 3, 4, 5, 6, 7, 9, 10]
[1, 2, 3, 5, 6, 7, 9, 10]
[1, 6, 7, 9, 10]
10
6

 

★ 검색

count : 특정 요소의 개수를 조사하는 기능입니다.

min : 리스트의 요소 중 최소값을 찾는 기능입니다.

max : 리스트의 요소 중 최대값을 찾는 기능입니다.

in , not in : 요소의 존재 여부를 검사하는 기능입니다.

 

 count, min, mix

num=[2,5,6,4,2,5,5,4,2,3]

print(num.count(5)) # 3

print(max(num)) # 6

print(min(num)) # 2


 

★ 정렬

sort : 리스트의 각 요소들을 오름차순으로 정렬하는 기능이다.

reverse : 리스트 내의 각 요소들을 역전시킨다. 

sort, reverse

num=[8,4,2,4,6,2,3]

num.sort()

print(num) # [2, 2, 3, 4, 4, 6, 8]

num.reverse()

print(num) # [8, 6, 4, 4, 3, 2, 2]

 

숫자 뿐만아니라 sort 함수는 문자열까지도 정렬을 할 수 있습니다. 대문자가 더 작은 경우로 판단이 되고, 그 다음이 알파벳 순서입니다.

문자열 정렬

num=["Korea","japan","China","america"]

num.sort()

print(num)

num.sort(key=str.lower) # 대소문자를 무시하고 비교

print(num)

result

['China', 'Korea', 'america', 'japan']
['america', 'China', 'japan', 'Korea']

 

 

■ 튜플

 튜플은 리스트와는 다르게 문자열처럼 불변 자료의 집합입니다. 그리고 list는 [ ] 를 사용했던 반면 tuple은 ( ) 를 사용합니다. 굳이 ( ) 를 사용하지 않아도 콤마로 구분된 값이 나열되어 있으면 튜플이라고 파악합니다. 따라서 튜플을 사용할 때에는 따로 괄호를 감싸지 않아도 되어서 편리합니다. 

 튜플은 변경을 하거나 삭제를 시키는 것은 불가능하지만 튜플은 여러 개의 변수에 값을 한꺼번에 대입하는 좋은 기능을 제공합니다. 

tuple

tu="life","gut","karma"

인생, 배짱, 업보=tu

print(인생)

print(배짱)

print(업보)

result

life
gut
karma

 

위의 결과를 보면 알 수 있듯이 좌변과 우변의 요소 개수가 같아야합니다. 그래야 서로 각 요소들이 대응이 되기 때문입니다. 

 

 사실 이런 기능만 놓고 본다면 튜플을 왜 사용하는지에 대해서 많은 의문을 가질 거라 생각합니다. 튜플을 사용하는 이유는 비용의 차이 입니다. 리스트는 변경 가능성 때문에 항상 변화에 대비를 해야해서 더 많은 메모리를 사용하고 속도도 느려지는 원인이 됩니다. 그에 반면에 튜플같은 경우에는 내부 구조도 훨씬 단순하고 읽는 속도도 빠르기 때문에 그에 대한 비용에서 차이가 납니다. 그리고 튜플의 또 다른 장점으로 불변성이 있습니다. 이는 결국 편집을 할 수 없다는 뜻이고, 그 만큼 튜플은 어떠한 조건에도 바꿔질 수 가 없기 때문에 안정적입니다. 하지만 각각의 기능이 필요할 때면 서로 type변환을 해주면 되기 때문에 자유롭지만 엄청난 시간이 소요된다는 것을 유의해야 합니다.

'컴퓨터 프로그래밍 > python' 카테고리의 다른 글

Python 컬렉션(Collection)  (0) 2020.08.13
Python 사전(Dictionary)과 집합(Set)  (0) 2020.08.12
Python 포맷팅(Format)  (0) 2020.08.12
Python 문자열 관리(String management)  (0) 2020.08.12
python 산술(Arithmetic)  (0) 2020.08.12

댓글