개요

 

딕셔너리 정렬에는

 

1. key 기준 정렬

 

2. value 기준 정렬

 

이 있다. 상황에 따라 맞게 사용한다.

 

 

 

key 기준 정렬

 

오름차순

 

sorted 함수를 사용하면 된다.

 

sorted에 딕셔너리를 넣었을 때는 딕셔너리의 key 기준으로 정렬하는 것이 default,

 

오름차순이 default 기 때문에 dict의 item만 넣으면 된다.

 

dict = sorted(dict.items())

 

내림차순

 

dict = sorted(dict.items(), reverse=True)

 

 

value 기준 정렬

 

value 기준 정렬은 key 기준 정렬 때보다 스킬이 필요하다.

 

1. lambda 활용

 

2. operator.itemgetter 활용

 

 

lambda 활용

 

dict = sorted(dict.items(), key=lambda x:x[1])

 

람다를 활용하여 x[1] 즉, 딕셔너리의 인덱스 1인 value 값을 정렬 기준으로 잡는다는 명시이다.

 

reverse 파라미터를 적용할 수 있다. (내림차순)

 

dict = sorted(dict.items(), key=lambda x:x[1], reverse=True)

 

 

operator.itemgetter 활용

 

import operator
 
dict= sorted(dict.items(), key=operator.itemgetter(1))

 

operator.itemgetter는 주로 sorted와 같은 함수의 key 파라미터에 적용되어

 

다중 수준의 정렬을 가능하게 해 준다.

 

즉, 리스트 및 배열의 특정 인덱스 기준으로 sort하게 해준다.

 

여기서는 딕셔너리의 인덱스 1인 value값을 기준으로 한다는 명시이다.

 

reverse 파라미터를 적용할 수 있다. (내림차순)

 

import operator
 
dict= sorted(dict.items(), key=operator.itemgetter(1), reverse=True)

 

 

여담

 

value 기준으로 정렬할 때 key 값만 얻는 목적이라면

 

위의 복잡한 방법 대신

 

dict= sorted(dict, key=dict.get)

 

를 이용하면 된다.

 

dict 자체를 sort 대상으로 넣고 .get 즉, value 자체를 key의 파라미터로 넣으면

 

정렬된 key 값이 리스트로 반환된다.

 

프로그래머스의 해당 문제를 풀다가 알게되었다.

 

programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

 

반응형

 

오류 상황

 

프로그래머스의 디스크 컨트롤러를 풀던 도중

 

programmers.co.kr/learn/courses/30/lessons/42627

 

코딩테스트 연습 - 디스크 컨트롤러

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를

programmers.co.kr

 

deque 반복문을 돌며 pop 하려 할 때 오류가 나왔다.

 

js = deque(jobs)
for s, t in js:
	if s <= time:
		js.popleft()
		heapq.heappush(heap, (t, s))

 

 

 

 

오류 원인

 

파이썬의 deque 같은 경우 자바의 list처럼

 

deque의 반복문을 돌릴 때내용이 변경되거나 사이즈가 변할 때 나타난다.

 

 

 

 

해결책 1

 

deepcopy하여 새로운 객체로 루프를 돌리고 원래 deque의 내용을 변경한다.

 

import copy

js = deque(jobs)
cnt = 0
for s, t in copy.deepcopy(js):
	if s <= time:
		js.popleft()
		heapq.heappush(heap, (t, s))
	

 

 

해결책 2

 

루프를 돌며 변경할 부분을 저장해놓은 후 루프가 끝난 후 처리한다.

 

 

js = deque(jobs)
cnt = 0
for s, t in js:
	if s <= time:
		cnt += 1
		heapq.heappush(heap, (t, s))

for i in range(cnt):
	js.popleft()

 

cnt로 없앨 부분만큼을 기록한 후 이후에 처리한 모습이다.

반응형

'Python' 카테고리의 다른 글

[Python] 딕셔너리 정렬 및 출력하기  (0) 2021.05.04
itemgetter를 사용해서 다차원 리스트, 튜플 정렬  (0) 2021.03.16
for - else문  (0) 2021.03.14

operator 모듈의 itemgetter를 이용하면 다차원의 리스트 및 튜플을 특정 인덱스 기준으로 정렬할 수 있다.

 

1. 리스트

 

리스트 같은 경우 기본으로 사용하는 sort 혹은 sorted 메소드에

 

key = itemgetter( [ 기준 인덱스 ] ) 옵션을 주면 된다.

 

예시) 4번째 인덱스 기준으로 sorting

리스트를 특정 인덱스 기준으로 sort

 

 

기본적으로 오름차순으로 정렬되며

 

reverse = True 옵션을 주면 내림차순으로 정렬된다.

 

예시)

 

 

 

2. 튜플

 

리스트와 같이 key = itemgetter( [ 기준 인덱스 ] ) 옵션을 주면 된다.

 

튜플을 특정 인덱스 기준으로 sort

 

기본적으로 오름차순으로 정렬되며

 

reverse = True 옵션을 주면 내림차순으로 정렬된다.

 

 

딕셔너리 데이터를 value 기준으로 sort하는데 해당 기법이 사용되기도 한다.

 

딕셔너리 key 기준 sorting

딕셔너리 데이터를 key를 기준으로 sorting할 때 이 방식으로 한다.

 

value 기준으로 할 때는 itemgetter를 이용해야한다.

 

딕셔너리 value 기준 sorting

 

dict.items() 는 (key - value)튜플이 리스트에 담긴 형태로 딕셔너리 자료형을 내보내게 된다.

 

그 때 itemgetter(1)로 튜플의 2번째 index인 value 값을 기준으로 잡으며 sorting할 수 있게된다. 

반응형

'Python' 카테고리의 다른 글

[Python] 딕셔너리 정렬 및 출력하기  (0) 2021.05.04
[python] RuntimeError: deque mutated during iteration  (0) 2021.04.20
for - else문  (0) 2021.03.14

파이썬에서는 if - else문 말고도 for - else문이 있다.

 

for문이 중간에 break 등으로 끊키지 않고 끝까지 수행 되었을 때 else문이 실행된다.

 

코딩을 하다보면 for문이 중간에 끊켰는지 판별해야 하는 경우가 있다.

 

대부분의 경우 flag를 두어 break됐을 때 flag를 True로 변경해서 판단한다. 나도 이 방법을 사용한다.

 

파이썬에서는 for - else문을 통해 간단하게 해결 가능하다.

 

특징)

else의 들여쓰기는 for와 일치해야 한다.

 

예시)

프로그래머스의 '스킬트리' 문제를 풀다가 알게되었다.

programmers.co.kr/learn/courses/30/lessons/49993

 

코딩테스트 연습 - 스킬트리

 

programmers.co.kr

문제 설명

 

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

 

 

제한 조건

  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.

  • 스킬 순서와 스킬트리는 문자열로 표기합니다.

    • 예를 들어, C → B → D 라면 "CBD"로 표기합니다

  • 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.

  • skill_trees는 길이 1 이상 20 이하인 배열입니다.

  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.

    • skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

 

입출력 예

 

skill

skill_trees

return

    "CBD"

    ["BACDE", "CBADF", "AECB", "BDA"]

    2

 

입출력 예 설명

  • "BACDE": B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.

  • "CBADF": 가능한 스킬트리입니다.

  • "AECB": 가능한 스킬트리입니다.

  • "BDA": B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.

 

풀이)

스킬 순서 skill을 스택에 넣고 스킬트리와 비교하며 후행 스킬이 선행 스킬이 나오기 전에 나왔는지 확인하며

순서대로 잘 나올 때 스킬 순서를 하나씩 없애가며 푸는 문제이다.

 

내가 푼 코드

나는 flag를 두어 스킬트리 for문을 도는 도중 후행스킬이 먼저나와 for문이 끝난 경우를 판단했다.

 

다른 사람의 풀이

다른 사람의 풀이 중 이것을 for - else문으로 간단히 구현한 모습을 보았다.

 

for문이 완전히 다 돌았다면 else문이 실행된다.

 

flag를 둘 필요가 없어진다.

 

다른 언어에는 없는 for - else문을 이용하여 파이썬의 장점을 살려보자. 

반응형

+ Recent posts