스터디노트_자료구조_List_리스트

MR.HAN·2023년 10월 28일

스터디노트

목록 보기
6/9

List : 배열과 같이 여러개의 데이터를 나열한 자료구조

  • '[]'를 이용해서 선언하고, 데이터 구분은 ','를 이용한다.
  • list = ['a', 'b', 'c'] --> a, b, c는 아이템(요소)라고 한다.
  • 숫자, 문자(열), 논리형 등 모든 기본 데이터를 같이 저장할 수 있다.
  • List에 또 다른 컨테이너 자료형 데이터를 저장할 수도 있다.
strs = [3.14, '십', 20, 'one', '3.141592']
print('strs : {}'.format(strs))
print(type(strs))
>>
strs : [3.14, '십', 20, 'one', '3.141592']
<class 'list'>

1. Index : 아이템에 자동으로 부여되는 번호표

  • 맨 앞부터 0
  • 잘못된 인덱스 사용하면 에러 발생 IndexError
  • 개별 아이템을 인덱스로 뽑아내면 아이템 본연의 Data type으로 바뀜.
numbers = [10, 20, 30, 40, 50]

print('numbers : {}'.format(numbers))
print('numbers[0] : {}'.format(numbers[0]))
print('numbers[1] : {}'.format(numbers[1]))
print('numbers[2] : {}'.format(numbers[2]))
print('numbers[3] : {}'.format(numbers[3]))
print('numbers[4] : {}'.format(numbers[4]))
print('numbers[0] : {}'.format(type(numbers[0])))
>>
numbers : [10, 20, 30, 40, 50]
numbers[0] : 10
numbers[1] : 20
numbers[2] : 30
numbers[3] : 40
numbers[4] : 50
numbers[0] : <class 'int'>

2. len() 함수 : list의 길이를 반환 (list에 저장된 아이템 개수)

  • 문자열의 길이도 반환
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
sLength = len(students)
print('List : {}'.format(students))
print('List의 길이 : {}'.format(sLength))

str = 'Hello python!!'
print('문자열의 길이 : {}'.format(len(str)))
>>
List : ['홍길동', '박찬호', '이용규', '박승철', '김지은']
List의 길이 : 5

문자열의 길이 : 14

len()과 반복문을 이용하면 list의 아이템 조회가 가능

students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']

# for
for i in range(len(students)):
    print(students[i])

# while
n = 0
sLength = len(students)
while n < sLength:
    print(students[n])
    n += 1

# for (지역변수)
for item in students:
    print(item)
>>
홍길동
박찬호
이용규
박승철
김지은

3. list와 for문

  • for문을 이용하면 list의 아이템을 자동으로 참조할 수 있다.
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']

# for
for i in range(len(students)):
    print(students[i])

# for (지역변수)
for student in students: # student라는 지역변수에 List 아이템들이 순차적으로 할당됨.
    print(student)
>>
홍길동
박찬호
이용규
박승철
김지은
  • list 내부의 또 다른 list 내 아이템을 조회할 수도 있다.
studentCnts = [[1, 19], [2, 20], [3, 22], [4, 18], [5, 21]] # 내부의 리스트 하나당 인덱스 한개가 부여됨.

# 1번 방법
for i in range(len(studentCnts)):
    print('{}반 학생수 : {}'.format(studentCnts[i][0], studentCnts[i][1]))

# 2번 방법
for classNo, cnt in studentCnts:
    print('{}반 학생수 : {}'.format(classNo, cnt))
>>
1반 학생수 : 19
2반 학생수 : 20
3반 학생수 : 22
4반 학생수 : 18
5반 학생수 : 21
  • for문과 if문을 이용해서 과락 과목(60점 미만) 출력하기
scores = [['국어', 58],
          ['영어', 77],
          ['수학', 89],
          ['과학', 99],
          ['국사', 50]]

minScore = 60

# 1번 방법
for item in scores:
    if item[1] < minScore:
        print('과락 과목 : {}, 점수 : {}'.format(item[0], item[1]))

# 2번 방법
for subject, score in scores:
    if score < minScore:
        print('과락 과목 : {}, 점수 : {}'.format(subject, score))

# 3번 방법
for subject, score in scores:
    if score >= minScore:
        continue # 조건문 블록 탈출하여 다음 for 반복문 실행
    print('과락 과목 : {}, 점수 : {}'.format(subject, score))
>>
과락 과목 : 국어, 점수 : 58
과락 과목 : 국사, 점수 : 50

4. list와 while문

  • while문을 이용하면 다양한 방법으로 아이템 조회가 가능하다.
cars = ['그랜저', '소나타', '말리부', '카니발', '쏘렌토']

# 1번 방법
n = 0

while n < len(cars):
    print(cars[n])
    n += 1

# 2번 방법
n = 0
flag = True

while flag:
    print(cars[n])
    n += 1

    if n == len(cars):
        flag = False # flag != True이므로 반복문 탈출

# 3번 방법
n = 0

while True:
    print(cars[n])
    n += 1

    if n == len(cars):
        break # while 반복문 탈출 
>>
그랜저
소나타
말리부
카니발
쏘렌토
  • list 내부의 또 다른 list 내 아이템을 조회할 수도 있다.
# 학급별 학생 수와 전체 학생 수 그리고 평균 학생수를 출력

studentCnts = [[1, 19], [2, 20], [3, 22], [4, 18], [5, 21]]

sum = 0

n = 0
while n < len(studentCnts):
    classNo = studentCnts[n][0]
    cnt = studentCnts[n][1]

    print('{}반 학생수 : {}'.format(classNo, cnt))

    sum += cnt
    n += 1

print(f'전체 학생 수 : {sum}명')
print(f'평균 학생 수 : {int(sum / len(studentCnts))}명')
>>
1반 학생수 : 19
2반 학생수 : 20
3반 학생수 : 22
4반 학생수 : 18
5반 학생수 : 21
전체 학생 수 : 100명
평균 학생 수 : 20명

5. enumerate()

  • enumerate() 함수를 이용하면 아이템을 열거할 수 있다.
sports = ['농구', '수구', '축구', '마라톤', '테니스']

for idx, value in enumerate(sports):
    print('{} : {}'.format(idx, value))

# enumerate() 함수는 문자열에도 적용할 수 있다.
>>
0 : 농구
1 : 수구
2 : 축구
3 : 마라톤
4 : 테니스
  • 가장 좋아하는 스포츠가 몇 번째에 있는지 출력하는 프로그램
sports = ['농구', '수구', '축구', '마라톤', '테니스']
favoriteSportInput = input('가장 좋아하는 스포츠 : ') # 축구

n = 0
for idx, value in enumerate(sports):
    if value == favoriteSportInput:
        n = idx + 1

print('{}(은)는 {}번째에 있습니다.'.format(favoriteSportInput, n))
>>
가장 좋아하는 스포츠 : 축구
축구(은)는 3번째에 있습니다.

6. append()

  • append() 함수를 이용하면 마지막 인덱스에 아이템을 추가할 수 있다.
# List 안에 List도 추가 가능
scores = [['국어', 88],
          ['영어', 91]]
scores.append(['수학', 96])

print(f'scores : {scores}')
>>
scores : [['국어', 88], ['영어', 91], ['수학', 96]]

7. insert()

  • insert() 함수를 이용하면 특정 위치(인덱스)에 아이템을 추가할 수 있다.
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
students.insert(3, '강호동')

print(f'students : {students}')

words = ['I', 'a', 'boy.']
words.insert(1, 'am')

for word in words:
    print('{} '.format(word), end='')
>>
students : ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
I am a boy. 
  • 오름차순으로 정렬되어 있는 숫자들에 사용자가 입력한 정수를 추가하는 프로그램
    (단, 추가 후에도 오름차순 정렬이 유지되어야 한다.)
numbers = [1, 3, 6, 11, 45, 54, 62, 74, 85]
inputNumber = int(input('숫자 입력 : '))
insertIdx = 0

for idx, number in enumerate(numbers):
   
    if insertIdx == 0 and inputNumber < number: # 최초(insertIdx == 0 and)로 할당된 것
        insertIdx = idx

numbers.insert(insertIdx, inputNumber)
print(numbers)
>>
숫자 입력 : 4
[1, 3, 4, 6, 11, 45, 54, 62, 74, 85]

8. pop()

  • pop() 함수를 이용하면 마지막 인덱스에 해당하는 아이템을 삭제할 수 있다.
    pop(n) 인덱스 번호 n을 넣어 해당하는 인덱스의 아이템을 삭제할 수 있다.
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동']
students.pop()
print(f'students : {students}')

students = ['홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동']
rValue = students.pop(3)
print(f'rValue : {rValue}')
>>
students : ['홍길동', '박찬호', '이용규', '박승철', '김지은']
students : ['홍길동', '박찬호', '이용규', '김지은', '강호동']
  • 삭제한 아이템을 다른 변수에 할당할 수 있음.
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동']
rValue = students.pop()
print(f'rValue : {rValue}')
>>
rValue : 강호동
  • 점수표에서 최저, 최고 점수 삭제
playerScores = [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
print('playerScores : {}'.format(playerScores))

minScore = 0; maxScore = 0
minScoreIdx = 0; maxScoreIdx = 0

for idx, score in enumerate(playerScores):

    if idx == 0 or minScore > score: # minScore = 9.5 부터 비교 시작
        minScoreIdx = idx
        minScore = score

print('minScore : {}, minScoreIdx : {}'.format(minScore, minScoreIdx))
playerScores.pop(minScoreIdx)

for idx, score in enumerate(playerScores):

    if maxScore < score:
        maxScoreIdx = idx
        maxScore = score

print('maxScore : {}, maxScoreIdx : {}'.format(maxScore, maxScoreIdx))
playerScores.pop(maxScoreIdx)

print('playerScores : {}'.format(playerScores))
playerScores : [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
minScore : 8.8, minScoreIdx : 4
maxScore : 9.8, maxScoreIdx : 3
playerScores : [9.5, 8.9, 9.2, 9.0]

9. remove()

  • remove() 함수를 이용하면 특정 아이템을 삭제할 수 있다.
    특정 아이템을 직접 입력
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은', '강호동']
print(students)

while '강호동' in students: 
    students.remove('강호동')
print(students)
>>
['홍길동', '박찬호', '이용규', '박승철', '김지은']

10. extend()

  • extend() 함수를 이용하면 리스트에 또 다른 리스트를 연결(확장)할 수 있다.
    덧셈 연산자를 이용해서 리스트를 연결할 수도 있다.(확장의 개념은 아님. 원래 리스트는 그대로 있고 새로운 리스트가 생김)
group1 = ['홍길동', '박찬호', '이용규']
group2 = ['강호동', '박승철', '김지은']
print(f'group1 : {group1}')
print(f'group2 : {group2}')

group1.extend(group2)
print(f'group1 : {group1}')
print(f'group2 : {group2}')

print('-' * 70)

group1 = ['홍길동', '박찬호', '이용규']
group2 = ['강호동', '박승철', '김지은']
print(f'group1 : {group1}')
print(f'group2 : {group2}')

result = group1 + group2
print(f'result : {result}')
print(f'group1 : {group1}')
print(f'group2 : {group2}')
>>
group1 : ['홍길동', '박찬호', '이용규']
group2 : ['강호동', '박승철', '김지은']
group1 : ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
group2 : ['강호동', '박승철', '김지은']
----------------------------------------------------------------------
group1 : ['홍길동', '박찬호', '이용규']
group2 : ['강호동', '박승철', '김지은']
result : ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
group1 : ['홍길동', '박찬호', '이용규']
group2 : ['강호동', '박승철', '김지은']
  • 나와 친구가 좋아하는 번호를 합치되 번호가 중복되지 않게하는 프로그램
myFavoriteNumbers = [1, 3, 5, 6, 7]
friendFavoriteNumbers = [2, 3, 5, 8, 10]

addList = myFavoriteNumbers + friendFavoriteNumbers
print(f'addList : {addList}')

result = []
for n in addList: # in, not in
    if n not in result:
        result.append(n)
print(f'result : {result}')
>>
addList : [1, 3, 5, 6, 7, 2, 3, 5, 8, 10]
result : [1, 3, 5, 6, 7, 2, 8, 10]

11. sort()

  • sort() 함수를 이용하면 아이템을 정렬할 수 있다.(오름차순)
    sort(reverse = True) (내림차순)
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']

students.sort()
print(f'students : {students}')

students.sort(reverse = True)
print(f'students : {students}')

students.sort(reverse = False)
print(f'students : {students}')
>>
students : ['강호동', '김지은', '박승철', '박찬호', '이용규', '홍길동']
students : ['홍길동', '이용규', '박찬호', '박승철', '김지은', '강호동']
students : ['강호동', '김지은', '박승철', '박찬호', '이용규', '홍길동']

12. reverse()

  • reverse() 함수를 이용하면 아이템 순서를 뒤집을 수 있다.
numbers = [2, 3.14, 9, 12, 3, 1]
numbers.reverse()
print(f'numbers : {numbers}')
>>
numbers : [1, 3, 12, 9, 3.14, 2]

13. 리스트 슬라이싱

  • [n:m]을 이용하면 리스트에서 원하는 아이템만 뽑아낼 수 있다.
    n은 포함 m은 앞까지 ex. [2, 4] --> 2 <= n < 4
    문자열도 슬라이싱 가능하다.
numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print(f'numbers : {numbers}')
print(f'numbers : {numbers[2:4]}')
print(f'numbers : {numbers[:4]}') # 0 부터 3까지
print(f'numbers : {numbers[2:]}') # 2 부터 끝까지
print(f'numbers : {numbers[2:-2]}') # idx는 012345 뒤에서부터 -1-2-3-4-5-6
print(f'numbers : {numbers[-5:-2]}')

# 슬라이싱할 때 단계를 설정할 수 있다.
print(f'numbers : {numbers[2:-2:2]}')
>>
numbers : [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
numbers : [0.12, 1]
numbers : [2, 50, 0.12, 1]
numbers : [0.12, 1, 9, 7, 17, 35, 100, 3.14]
numbers : [0.12, 1, 9, 7, 17, 35]
numbers : [7, 17, 35]
numbers : [0.12, 9, 17]
  • 슬라이싱을 이용해서 아이템을 변경(대체)할 수 있다.
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students[1:4] = ['park chanho', 'lee yonggyu', 'gang hodong']
print(f'students : {students}')

students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students[1:4] = ['park chanho', 'lee yonggyu'] # 변경할 리스트 아이템 부족, '강호동' 삭제됨.
print(f'students : {students}')
>>
students : ['홍길동', 'park chanho', 'lee yonggyu', 'gang hodong', '박승철', '김지은']
students : ['홍길동', 'park chanho', 'lee yonggyu', '박승철', '김지은']
  • slice() 함수를 이용해서 아이템을 슬라이싱 할 수 있다.
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print(f'students : {students}')
print(f'students : {students[slice(2, 4)]}')
print(f'students : {students[slice(4)]}')
print(f'students : {students[slice(2, len(students))]}')
>>
students : ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students : ['이용규', '강호동']
students : ['홍길동', '박찬호', '이용규', '강호동']
students : ['이용규', '강호동', '박승철', '김지은']

14. 그 외의 기능

  • 리스트를 곱셈 연산하면 아이템이 반복된다.
students = ['홍길동', '박찬호', '이용규']
studentsMul = students * 2
print('studentsMul : {}'.format(studentsMul))
>>
studentsMul : ['홍길동', '박찬호', '이용규', '홍길동', '박찬호', '이용규']
  • index(item) 함수를 이용하면 item의 인덱스를 알아낼 수 있다.
students = ['홍길동', '강호동', '박찬호', '이용규', '강호동', '박승철', '김지은']
searchIdx = students.index('강호동')
print('searchIdx : {}'.format(searchIdx)) # 가장 앞쪽 하나만 찾음.

searchIdx = students.index('강호동',2, 6) # idx 2~5 까지 범위 지정해서 찾음.
print('searchIdx : {}'.format(searchIdx))
>>
searchIdx : 1
searchIdx : 4
  • count() 함수를 이용하면 특정 아이템의 개수를 알아낼 수 있다.
students = ['홍길동', '강호동', '박찬호', '이용규', '강호동', '박승철', '김지은']

searchCnt = students.count('강호동')
print('searchCnt : {}'.format(searchCnt))

searchCnt = students.count('김아무개')
print('searchCnt : {}'.format(searchCnt))
>>
searchCnt : 2
searchCnt : 0
  • del 키워드를 이용하면 특정 아이템을 삭제할 수 있다.
students = ['홍길동', '강호동', '박찬호', '이용규', '강호동', '박승철', '김지은']

del students[1]
print('students : {}'.format(students))

del students[1:4]
print('students : {}'.format(students))
>>
students : ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students : ['홍길동', '박승철', '김지은']

0개의 댓글