def solution(arr, divisor):
for element in arr:
if element%divisor!=0:
arr.remove(element)
if not arr:
arr.append(-1)
return sorted(arr)
이게 왜 이러지
7은 분명히 안나눠떨어지는데 만약에 나눠떨어진다고하면 9도 리스트에 포함돼서 나와야하는데 왜그러지??
결국 인덱스때문인듯? 이렇게는 못푸는 건가
입력값 〉 [5, 9, 7, 10], 5
기댓값 〉 [5, 10]
실행 결과 〉 실행한 결괏값 [5,7,10]이 기댓값 [5,10]과 다릅니다.
def solution(arr, divisor):
return sorted([x for x in arr if x%divisor==0]) or [-1]
# return sorted([x for x in arr if x%divisor==0]) if len(arr) != 0 else [-1];
or 쓴게 진짜 짱
return 문에서도 if를 써서 코드를 줄일 수 있음
def solution(N, stages):
no_of_player_on_stage=[]
for i in range(len(stages)):
if i+1 in stages: # i+1 = 스테이지 넘버
stage_player=stages.count(i+1)
elif i+1 not in stages: #else로 바꿔도 상관 없을듯
stage_player=0
no_of_player_on_stage.append(stage_player)
while len(no_of_player_on_stage)!=N:
no_of_player_on_stage.append(0)
여기서 while이 무한루프를 돌았는데
처음엔 range(len()) 쓰는 게 습관이 돼서 그렇게 써놓고는 i를 인덱스로 쓰지 않고 요소 값으로 썼다. 애초에 내가 구상한 코드에서는 인덱스를 쓸 필요가 전혀 없었는데 len를 쓴 걸 보면 습관이란 게 참 무서운 것 같다
while이 무한루프를 돌았던 이유는 stages길이가 N보다 더 클 수 있기 때문이다. 여기서 같지 않다 대신 작다를 썼으면 애초에 오류가 나서 못돌고 에러가나서 더 금방 알았을 것 같다. 컴퓨터 고장난줄 ㅋㅋ
failure=[]
for no,no_of_player in enumerate(no_of_player_on_stage):
if sum(no_of_player_on_stage[no:]) !=0:
if N+1 in stages:
fin_players=stages.count(N+1)
failure.append(no_of_player/(sum(no_of_player_on_stage[no:])+fin_players))
else:
failure.append(no_of_player/sum(no_of_player_on_stage[no:]))
else:
failure.append(0)
위에서 구한 스테이지별 플레이어의 수 리스트는 모든 스테이지를 클리어하지 않은 플레이어를 고려하지 않아서 리스트에 그 부분이 빠져있어서 추가로 계산을 해줘야하는데 이때 클리어 플레이어가 있는지 없는지를 또 구분을 해줘야한다고 생각해서 분모가 0이 아닌 경우에서 디 부분을 또 if-else로 나눠줬는데 애초에 stage에 클리어한 사용자가있는지 stages에서 count를 하면 되는 거라서 (없으면 알아서 0이 들어가고 있으면 갯수를 세어주니까) 예외상황이 발생할만한 게 없어서 분기를 탈 필요가 없었다.
failure=[]
for no,no_of_player in enumerate(no_of_player_on_stage):
if sum(no_of_player_on_stage[no:]) !=0:
fin_players=stages.count(N+1)
failure.append(no_of_player/(sum(no_of_player_on_stage[no:])+fin_players))
else:
failure.append(0)
조건문에서 사용하지 않는다면 fin_players를 꼭 for문 밖이나 조건문 전에 계산할 필요도 없다. 그냥 사용하기 전에만 값이 있으면 된다.
그리고 조건문에서 분모가 0이면 안된다는 생각때문에 처음에 fin_players까지 들어간 전체가 다 조건식에 들어가야한다고 생각했는데 어차피 fin_players의 값은 0이상의 정수값이라서 고려할 필요가 없다? 그 다음 스테이지에 사람들이없고 클리어한 사용자만 있으면 fin_players도 고려해야하는 게 맞다 결국 처음부터 스테이지별 플에이어의 수 리스트를 클리어한 플레이어까지 포함해서 구했어야하는 게 맞다. 그렇게 해야 이런저런 예외 상황이 발생하지 않는다..
stage_no = [x+1 for x in range(N)]
failure_dict=dict(zip(stage_no,failure))
failure_dict_sorted=sorted(failure_dict, key=lambda x: failure_dict[x], reverse=True)
return failure_dict_sorted
처음엔 그냥 리스트의 인덱스+1로 출력하고 싶었는데 그게 잘 안돼서 딕셔너리로 만들어서 키값을 출력했다.
⭐failure_dict[x] == value
라는 거⭐
이 다음에 실패율 분모를 조금 다른 방식으로 구했었는데
failure=[]
all_players=sum(no_of_player_on_stage)
fin_players=stages.count(N+1)
for no,no_of_player in enumerate(no_of_player_on_stage):
if (all_players-sum(no_of_player_on_stage[:no])+fin_players) !=0:
failure.append(no_of_player/(all_players-sum(no_of_player_on_stage[:no])+fin_players))
else:
failure.append(0)
여기서 all players에 fin_players를 더해버리면 뒤에서도 좀 더 깔끔하게 쓸 수 있을 것 같다.
return_list=[]
for pair in zip(idx,failure):
return_list.append(pair)
# return_list.append(dict(pair))
print('return_list:',dict(return_list)) # {1: 0.0, 2: 0.0, 3: 0.0, 4: 1.0}
주석처리한 부분 실행하면 에러남
기본적으로 dict()는 인자를 하나만 받는다 = 딕셔너리에 넣을 땐 리스트나 튜플을 이용해 값들을 묶어서 넣어야한다
❌TypeError: cannot convert dictionary update sequence element #0 to a sequence
dictionary update sequence 0번째 element를 sequence(딕셔너리)로 바꿀 수 없다.
튜플 하나는 딕셔너리로 바꿀 수가 없다
dict(((2,3),(2,3),(2,3))) # {2: 3}
dict(((2,3),(2,4),(2,5))) # {2: 5}
튜플 하나짜리는 튜플 안에 넣어봐도 딕셔너리로 바꿀 수 없고 동일한 에러가 난다
튜플 하나를 리스트 안에 넣으면 딕셔너리로 바꿀 수 있다
dict(((1,2))) # dict((1,2))와 동일한 에러 발생
dict([(1,2)]) # {1: 2}
❌ ValueError: dictionary update sequence element #0 has length 3; 2 is required
dict(('key','value'))
또는 dict(['key','value'])
이런식으로 값을 넣을 경우 발생하는 에러
튜플/리스트 안에 묶여서 딕셔너리 함수를 쓸 수는 있지만 key가 변환 대상인데 3글자여서 키-밸류로 분리를 할 수 없어서 생기는 에러
그냥 리스트는 딕셔너리로 안바뀌고 꼭 쌍이라는 걸 인식할 수 있도록 해줘아햔다
dict([['key','value']]) # {'key': 'value'}
dict([['key','value'],['h','n']]) # {'key': 'value', 'h': 'n'}
dict(('ke')) # ValueError: dictionary update sequence element #0 has length 1; 2 is required
dict(('ke','va')) # {'k': 'e', 'v': 'a'}
dict(['ke']) # {'k': 'e'}
문자열 분리해서 key-value를 만드는 방법은 문자열의 길이가 반드시 2여야한다 짝수면 되는 게 아니다 ⭐⭐⭐⭐
❓튜플과 리스트가 딕셔너리의 요소 안에 담겼을 때 차이가 생기는 건 mutable과 immutable의 차이인가?
근데 결국 프린트에만 dict로 바꿔서 출력을 했지 사용하는 건 dict로 안바꾸고 했는데 그래도 정상적인 결과가 출력된다는 건 튜플에서도 이건 끝까지 안해봤지만 결과를 dict에 넣었으면 뒷부분은 똑같이 쓸 수 있을듯 ⭕ pair가 튜플이니까
return_list=[]
stage_no = [x+1 for x in range(N)]
for pair in zip(stage_no,failure):
return_list.append(pair)
failure_dict=dict(return_list)
딕셔너리 생성
- dictionary={'key1':value1,'key2':value2}
- dict(key1=value1,key2=value2)
→dict(k='v',k1='v1')
이렇게 해도 키에 자동으로 ''가 붙음 → {'k': 'v', 'k1': 'v1'} 오히려 키값에 ''붙이면 아래랑 동일한 에러남
→dict(1='v',2='v1')
이건 안됨
SyntaxError: expression cannot contain assignment
변수 할당이라고 생각하는건가?- dict(key1:value1,key2:value2)
→ 이것도 안됨변경이 불가능한 데이터타입(immutable)은 모두 key가 될 수 있다: int, boolean, tuple, str
*mutable: list, dictionary
수정(값을 다시 할당했을 때) 주소값이 바뀌지않음
*iterable: sequence type - list, str, tuple딕셔너리 메소드
- dictionary.keys()->키값들이 모두 리스트에 저장되어 출력됨
- dictionary.values()->밸류값들이 모두 리스트에 저장되어 출력됨
- dictionary.items()->딕셔너리의 키,밸류가 한쌍씩 튜플에 담겨서 리스트에 저장되어 출력됨
- dictionary.get('key')->없는 키값을 출력해도 에러 x
- dictionary['key']->없으면 에러
- dictionary.pop('key')-> 값을 가져오지만 딕셔너리에서는 삭제됨
- dictionary.popitem()-> 마지막 원소를 튜플로 가져오고 딕셔너리에서는 삭제
TypeError: 'int' object is not subscriptable ->int[] 이런 식으로 쓸 수 없다는 뜻.
*딕셔너리 타입은 애초에 인덱싱 기능을 키값이 대신해줘서 키가 정수여서
딕셔너리[정수]이렇게 쓴다고해서 인덱스랑 헷갈릴 수가 없다
failure에서 max값을 하나씩 찾아서 인덱스+1 값이랑 매치시켜줄 수 있는데 그러려면 heap에서 pop을 써야할듯? 아니면 max찾고 다음 max를 쓰려면 어떻게 하지??