python - 자료 구조 문제 : 데이터 취업 스쿨 스터디 노트 11/17

slocat·2023년 11월 17일
0

start-data

목록 보기
15/75

리스트 - 중복 아이템 제거

numbers = [2, 22, 7, 8, 9, 2, 7, 3, 5, 2, 7, 1, 3]
print(f'numbers: {numbers}')

# 아이템을 삭제하면 인덱스가 줄어드는 것 고려하기
idx = 0
while True:

  # 무한루프 방지
  if idx >= len(numbers):
    break

  if numbers.count(numbers[idx]) >= 2:
    numbers.remove(numbers[idx])
    continue

  idx += 1

print(f'result: {numbers}')

>>>
numbers: [2, 22, 7, 8, 9, 2, 7, 3, 5, 2, 7, 1, 3]
result: [22, 8, 9, 5, 2, 7, 1, 3]

리스트 - 경우의 수 출력

# 4개의 숫자 중 서로 다른 숫자 3개를 선택
numbers = [4, 6, 7, 9]
result = []

for num in numbers:  # 4
  for num2 in numbers:  # 4 pass
    if num == num2: continue

    for num3 in numbers:  # 4, 6 pass
      if num == num3 or num2 == num3: continue

      result.append([num, num2, num3])

print(f'경우의 수: {len(result)}개')
print(result)

>>>
경우의 수: 24개
[[4, 6, 7], [4, 6, 9], [4, 7, 6], [4, 7, 9], [4, 9, 6], [4, 9, 7], ...

튜플 - 합집합, 교집합 구하기

tuple1 = (1, 3, 2, 6, 12, 5, 7, 8)
tuple2 = (0, 5, 2, 9, 8, 6, 17, 3)

union = list(tuple1)
intersection = []

for num in tuple2:
  if num not in tuple1:
    union.append(num)

  else:
    # 중복된다 = 교집합
    intersection.append(num)

union.sort()
intersection.sort()

print(f'합집합: {union}')
print(f'교집합: {intersection}')

>>>
합집합: [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 17]
교집합: [2, 3, 5, 6, 8]

튜플 - 학점 부여

scores = ({'kor': 92}, {'eng': 86})

for score in scores:
  for key in score.keys():
    if score[key] >= 90:
      score[key] = 'A'
    else:
      score[key] = 'B'

print(scores)

>>>
({'kor': 'A'}, {'eng': 'B'})

🔥🔥튜플 - 과일 개수에 따라 정렬

while문 내용을 조금씩 바꾸면서 curIdx, nextIdx의 변화를 확인해 봤다.
알고리즘을 배우고 나서 다시 풀어볼 생각이다.

fruits = ({'수박': 8}, {'포도': 13}, {'참외': 12},
          {'사과': 17}, {'자두': 19}, {'자몽': 15})

fruits = list(fruits)

curIdx = 0
nextIdx = 1
endIdx = len(fruits) - 1

while True:
    curDic = fruits[curIdx]
    nextDic = fruits[nextIdx]
    
    curDicCnt = list(curDic.values())[0]
    nextDicCnt = list(nextDic.values())[0]
    
    if curDicCnt > nextDicCnt:
        fruits.insert(curIdx, fruits.pop(nextIdx))
    
    nextIdx += 1        

    if nextIdx > endIdx:
        curIdx += 1
        nextIdx = curIdx + 1
        
        if curIdx == len(fruits) - 1:
            break

fruits = tuple(fruits)
print(f'sorted: {fruits}')

>>>
sorted: ({'수박': 8}, {'참외': 12}, {'포도': 13},
		 {'자몽': 15}, {'사과': 17}, {'자두': 19})

튜플 - 학급별 학생 수 평균, 최솟값, 최댓값, 편차

studentCnt = ({'1반': 18}, {'2반': 21}, {'3반': 20}, {'4반': 19}, {'5반': 22},
              {'6반': 20}, {'7반': 23}, {'8반': 17})

total = 0
minClass = ''; minCnt = 0
maxClass = ''; maxCnt = 0
deviation = []

# 평균, 최솟값, 최댓값 구하기
for idx, dic in enumerate(studentCnt):
  for key, value in dic.items():
    total += value

    if maxCnt < value:
      maxCnt = value
      maxClass = key

    if minCnt == 0 or minCnt > value:
      minCnt = value
      minClass = key

# 편차 구하기
avg = int(total / len(studentCnt))

for idx, dic in enumerate(studentCnt):
  for key, value in dic.items():
    deviation.append({key: (value - avg)})

print(f'전체 학생 수 : {total}명')
print(f'평균 학생 수: {avg}명')
print(f'학생 수가 가장 적은 학급: {minClass}({minCnt}명)')
print(f'학생 수가 가장 많은 학급: {maxClass}({maxCnt}명)')
print(f'학급별 학생 편차: {deviation}')

>>>
전체 학생 수 : 160명
평균 학생 수: 20명
학생 수가 가장 적은 학급: 8반(17명)
학생 수가 가장 많은 학급: 7반(23명)
학급별 학생 편차: [{'1반': -2}, {'2반': 1}, {'3반': 0}, {'4반': -1}, {'5반': 
2}, {'6반': 0}, {'7반': 3}, {'8반': -3}]

딕셔너리 - 문자열 분리하여 딕셔너리에 저장

⭐split()

text = '파이썬은 1991년 프로그래머인 귀도 반 로섬이 발표한 고급 프로그래밍 언어이다.'

# split(): 분리된 문자를 리스트로 반환
splitList = text.split()
dic = {}

for i in range(len(splitList)):
  dic[i] = splitList[i]

print(dic)

>>>
{0: '파이썬은', 1: '1991년', 2: '프로그래머인', 3: ' 
'귀도', 4: '반', ...}

딕셔너리 - 비속어를 찾아서 표준어로 변경

⭐replace()

words = {'짭새': '경찰관', '먹튀': '먹고 도망', '쪼개다': '웃다'}
text = '강도는 서로 쪼개다, 짭새을 보고 빠르게 따돌리며 먹튀했다.'

for key in words.keys():
  if key in text:
    text = text.replace(key, words[key])

print(text)

>>>
강도는 서로 웃다, 경찰관을 보고 빠르게 따돌리며 먹   
고 도망했다.

0개의 댓글