파이썬 질문 [('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)]

이런 식으로 순위를 내림차순으로 매기고, 같은 값에 대해서는 동일한 순위를 부여하고 그 수만큼 순위를 건너뛰고 다음 순위를 매기게 하고 싶습니다.

여기서 제가 원하는 건, 튜플에 요소를 추가하는 것이 불가능한데 어떻게 순위를 추가할 수 있는지 입니다.

  • 숙제인가요? 숙제인 것 같은데, 스스로 해보세요. 생각할 기회를 남에게 뺏기지 마시고. nowp 2020.11.5 13:35
  • 튜플에 요소값을 추가할 수 없는데, 순위를 구하고 어떻게 추가해야 하는지 그 방법을 고민하고 있는데, 작은 힌트라도 얻고 싶습니다. 알 수 없는 사용자 2020.11.5 13:43
  • 튜플에 요소를 추가할 수는 없지만, list 로 바꾸고, 요소를 추가한 후에, 그 리스트를 다시 튜플로 바꿀 수는 있습니다. / 질문에 위 댓글의 내용도 포함해 주셨다면, 단순한 숙제해결충이라는 오해는 안 받았을 수 있었을 것 같아요. nowp 2020.11.5 13:49
  • 답변 감사합니다. 저도 그렇게 하고 있습니다. 리스트를 3개 만들어 마지막 리스트에는 순위를 정하고 싶은데, 이 때는 for문과 if문을 사용해야하는 걸로 알고있는데, 어렵네요. 알 수 없는 사용자 2020.11.5 13:56
  • 왜 안 Dictionary요? 알 수 없는 사용자 2020.11.5 15:46

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))
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)