13. 자료구조_4~6

wonny_·2023년 7월 21일
0

자료구조&알고리즘

목록 보기
2/10
  • 리스트 연결

    • extend(): 리스트에 또 다른 리스트 연결(확장)할 수 있음
    • 덧셈 연산자를 이용해서 리스트를 연결할 수도 있음
  Q. 나와 친구가 좋아하는 번호를 합치되 번호가 중복되지 않게 출력
  
myFavNum = [1,3,5,6,7]
friendFavNum = [2,3,5,8,10]

print('myFavNum: {}'.format(myFavNum))
print('friendFavNum: {}'.format(friendFavNum))

addList = myFavNum + friendFavNum
print('addList: {}'.format(addList))

result = []
for number in addList:
    if number not in result:
       result.append(number)

print('result: {}'.format(result))     

  • 리스트 연결(확장)

    • sort() : 아이템 정렬 가능
      • sort(reverse = False), 생략가능; 오름차순 정렬
      • sotr(reverse = True) : 내림차순 정렬
Q. 최저/최고 점수 삭제 후 총점과 평균 출력

playerScore = [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
print('palyerScore: {}'.format(playerScore))

playerScore.sort()
print('playerScore: {}'.format(playerScore))
playerScore.pop(0)
playerScore.pop(len(playerScore)-1)
print('playerScore: {}'.format(playerScore))

sum = 0
avg = 0
for score in playerScore:
    sum += score

avg = sum / len(playerScore)

print('총점: {}'.format(round(sum, 2)))
print('평균: {}'.format(round(avg, 2)))

  • 리스트 아이템 순서 뒤집기

    • reverse() : 아이템 순서 뒤집기
 Q. 암호 해독 출력
 
secret = '27156231'
secretList = []
solvedList = ''

for cha in secret:
    secretList.append(int(cha))

print('secretList: {}'.format(secretList))

secretList.reverse()
print('secretList: {}'.format(secretList))

val = secretList[0] * secretList[1]
secretList.insert(2, val)

val = secretList[3] * secretList[4]
secretList.insert(5, val)

val = secretList[6] * secretList[7]
secretList.insert(8, val)

val = secretList[9] * secretList[10]
secretList.insert(11, val)

print('secretList: {}'.format(secretList))

  • 리스트 슬라이싱

    • [n:m]: 리스트에서 원하는 아이템만 뽑기
    • 문자열도 슬라이싱 가능
    • [n:m:s] 슬라이싱 할 때 단계(s → 아이템 간격) 설정 가능
    • 슬라이싱을 이용한 아이템 변경 가능
    • slice() 함수 이용해서 아이템 슬라이싱 가능
리스트 슬라이싱 
  
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은]'

print('students: {}'.format(students[2:4])) # 2 <= < 4
print('students: {}'.format(students[:4])) #앞에 생략하면 인덱스0부터 시작 
print('students: {}'.format(students[2:])) #뒤에 생략하면 인덱스2부터 끝까지 
print('students: {}'.format(students[2:-2])) #인덱스 2부터 뒤에서 -1, -2 해서 강호동까지 
print('students: {}'.format(students[-5:-2])) 
____________________________________________________________________________________
<결과값>
  
students: ['이용규', '강호동']
students: ['홍길동', '박찬호', '이용규', '강호동']
students: ['이용규', '강호동', '박승철', '김지은']
students: ['이용규', '강호동']
students: ['박찬호', '이용규', '강호동']

슬라이싱 단계 설정

numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]

print('numbers: {}'.format(numbers[2:-2:2]))
print('numbers: {}'.format(numbers[::2]))
_______________________________________________
<결과값>

numbers: [0.12, 9, 17]
numbers: [2, 0.12, 9, 17, 100]

슬라이싱 이용한 아이템 변경

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

students[1:4] = ['park chanho', 'lee yonggyu', 'gang hodong']
print('students: {}'.format(students))
___________________________________________________________________
<결과값>

students: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students: ['홍길동', 'park chanho', 'lee yonggyu', 'gang hodong', '박승철', '김지은']

slice()함수

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

print('students: {}'.format(students[slice(4)]))
print('students: {}'.format(students[slice(2, len(students))]))
print('students: {}'.format(students[slice(2, len(students)-2)]))
print('students: {}'.format(students[slice(len(students)-5, len(students)-2)]))
________________________________________________________________________________
<결과값>

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

  • 리스트 나머지 기능들

    • 리스트를 곱셈 연산하면 아이템이 반복
    • index(item): 아이템의 인덱스 파악
    • count(): 특정 아이템의 개수파악 가능
    • del 키워드를 사용하여 특정 아이템 삭제
      (슬라이싱 기능과 del키워드 함께 사용해서 아이템 삭제 가능 )
Q. 1부터 10까지의 정수가 중복되지 않고 섞여 있을 때 행운의 숫자 7의 위치 찾기

import random

sampleList = random.sample(range(1, 11), 10)

selectIdx = int(input('숫자 7의 위치 입력: '))
searchIdx = sampleList.index(7)

if searchIdx == selectIdx:
   print('빙고')
else:
    print('아쉬워')

print('sampleList: {}'.format(sampleList))
print('searchIdx: {}'.format(searchIdx))

Q. 하루동안 헌혈을 진행한 후 혈액형 별 개수 파악

import random

types = ['A', 'B', 'AB', 'O']
todayData = []
typeCnt = []

for i in range(100):
    type = types[random.randrange(len(types))]
    todayData.append(type)

print('todayData: {}'.format(todayData))
print('todayData length: {}'.format(len(todayData)))

for type in types:
    print('{}형 : {}개'.format(type, todayData.count(type)))

  • 튜플

    • 리스트와 비슷하지만, 아이템 변경 불가
      ex) list = [ ] tuple = ( )
    • 숫자, 문자열, 논리형 등 모든 기본 데이터 같이 저장 가능
    • 튜플에 또 다른 컨테이너 자료형 데이터를 저장 가능
      ex) dates = (10, 20, (30, 40))
    • 튜플 아이템은 인덱스를 이용해서 조회 가능
      ex) 튜플변수명[0]

  • in, not in 키워드

    • in, not in 키워드를 이용하면 아이템의 존재 유/무를 알 수 있음
    • 문자열에서도 가능
Q. 1-10까지 5개의 난수를 생성한 후, 사용자가 입력한 숫자 유무 출력 

import random

randomNumbers = random.sample(range(1, 11), 5)

userNumber = int(input('숫자 입력(확률 50%): '))
if userNumber in randomNumbers:
    print('빙고')
else:
    print('다음 기회에')

print('randomNumbers: {}'.format(randomNumbers))
print('userNumber: {}'.format(userNumber))

  • 튜플길이

    • 리스트와 마찬가지로 튜플에 저장된 아이템 개수
    • len()과 반복문을 이용하면 튜플의 아이템 조회 가능

  • 튜플 결합

    • +를 이용하여 두 개의 튜플 결합 가능
    • 리스트에 사용할 수 있는 extend()함수는 튜플에서 사용 불가
      (튜플은 아이템 수정이 되지 않기 때문에 연장 X)
Q. 튜플 이용해서 나와 친구가 좋아하는 번호를 합치되 번호 중복되지 않게 출력

myFavNum = (1, 3, 5, 6, 7)
friendFavNum = (2, 3, 5, 8, 10)

print('myFavNum: {}'.format(myFavNum))
print('friendFavNum: {}'.format(friendFavNum))

for num in friendFavNum:
    if num not in myFavNum:
       myFavNum = myFavNum + (num, )  #(num, ) -> num은 int여서 튜플로 바꿔주기

print('myFavNum: {}'.format(myFavNum))

  • 튜플 슬라이싱

    • 리스트와 마찬가지로[n:m]을 이용하면 원하는 아이템 추출 가능
    • 슬라이싱할 때 단계 설정 가능
    • 슬라이싱을 이용하여 아이템 변경 불가
    • 리스트에 튜플 아이템으로 변경 가능
    • slice(): 아이템 슬라이싱 가능

  • 리스트와 튜플 차이점

    • 튜플은 아이템 추가, 변경, 삭제 불가
    • 튜플 선언시 괄호 생략 가능
      ex) students = '홍길동', '박찬호', '이용규'
    • 리스트와 튜플은 자료형 변환 가능
      students = tuple(students)
      students = list(students)

profile
파이팅

0개의 댓글