파이썬 질문 [('a', 14), ('b', 14), ('c', 7), ('d', 6), ('e', 3), ('f', 1)] 에 순위추가하기.
조회수 543회
list_a = [('a', 14), ('b', 14), ('c', 7), ('d', 6), ('e', 3), ('f', 1)]
일 때,
[('a', 14, 1), ('b', 14, 1), ('c', 7, 3), ('d', 6, 4), ('e', 3, 5), ('f', 1, 6)]
이런 식으로 순위를 내림차순으로 매기고, 같은 값에 대해서는 동일한 순위를 부여하고 그 수만큼 순위를 건너뛰고 다음 순위를 매기게 하고 싶습니다.
여기서 제가 원하는 건, 튜플에 요소를 추가하는 것이 불가능한데 어떻게 순위를 추가할 수 있는지 입니다.
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
2 답변
-
>>> list_a = [('a', 14), ('b', 14), ('c', 7), ('d', 6), ('e', 3), ('f', 1)] >>> ranking = 1 >>> list_b = [] >>> for x in list_a: list_b.append( list(x)+[ranking] ) ranking += 1 >>> list_b [['a', 14, 1], ['b', 14, 2], ['c', 7, 3], ['d', 6, 4], ['e', 3, 5], ['f', 1, 6]] >>> for i in range(len(list_b)-1): b1, b2 = list_b[i], list_b[i+1] if b1[1] == b2[1]: list_b[i+1][2] = list_b[i][2] >>> >>> list_b [['a', 14, 1], ['b', 14, 1], ['c', 7, 3], ['d', 6, 4], ['e', 3, 5], ['f', 1, 6]] >>> list_b = [ tuple(x) for x in list_b ] >>> list_b [('a', 14, 1), ('b', 14, 1), ('c', 7, 3), ('d', 6, 4), ('e', 3, 5), ('f', 1, 6)]
더 좋은 방법도 있을 수 있어요.
-
- 번외: scala 로 해보기
def rankOfList[A, B](L: Seq[(A, B)]): Seq[(A, B, Int)] = { @annotation.tailrec def _rankOfList[A, B](L: Seq[(A, B)], acc: Seq[(A, B, Int)] = Seq.empty, callCnt:Int = 1): Seq[(A, B, Int)] = L match { case Nil => acc case x :: xs => _rankOfList(xs, acc :+ (x._1, x._2, if(!acc.isEmpty && acc.last._2 == x._2) acc.last._3 else callCnt), callCnt + 1) } _rankOfList(L) } val list_a = Seq(("a", 14), ("b", 14), ("c", 7), ("d", 6), ("d", 6), ("e", 3), ("f", 1)) rankOfList(list_a) => List((a,14,1), (b,14,1), (c,7,3), (d,6,4), (d,6,4), (e,3,6), (f,1,7))
- 직접 확인하기 => https://scalafiddle.io/sf/GEvtizi/4
댓글 입력