파이썬 2차원 리스트 질문드립니다.

조회수 2354회

안녕하세요. 리스트안의 리스트에서 평균을 구하는 함수를 만들려 합니다.


 grades = [
             ['Student', 'Quiz 1', 'Quiz 2', 'Quiz 3'],
             ['Joe', 100, 90, 80],
             ['McD', 88, 99, 111],
             ['Ruta', 50, 56, 67],
             ['Kang', 60, 62, 67],
             ['Samanda', 70, 79, 88],
             ['Mina', 98, 99, 100]]

첫번째 리스트는 설명을 하고 두번째 리스트부터는 데이터를 담고있습니다. 그리고 두번째 리스트의 첫번째 데이터는 string입니다.

코딩이 익숙하지않아 어디서부터 시작을 해야할지 감을 못잡겠습니다... 인터넷에서 2차원리스트에 관한 글들을 읽어보아도 이해가 잘 되지가 않네요...ㅎㅎㅎ

average = sum(maria.values()) / len(maria)

value()를 이용해서 숫자만 빼내려해도 뜻대로 되지는 않더라구요 어떤 방식으로 접근하는게 좋을까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 먼저 2차원 배열을 써야 한다는 가정 하에 위의 배열은 상당히 어렵게 만들어져 있군요 첫 번째 배열에 표로 생각하면 제목들이 들어가 있는 형태인데 의도는 잘 모르겠습니다만....일단 1차 리스트라는 것을 먼저 생각해보고 2차 리스트는 왜 쓰는 가를 생각해 봐야 할 것 같습니다. 리스트는 보통 같은 성격의 데이터를 한 곳에 모아서 표현 하는 것인데 2차 리스트는 1차 리스트에서 리스트 형태(1차)의 데이터를 가지고 있을 때 사용한다 라고 생각하시면 될 것 같아요..좀 어렵나요? 결론은 구성 자체가 리스트에 맞지 않게 어렵게 만들었다는 것이고 이게 주어진 문제 자체라고 한다면 규칙성을 찾아 다시 분리하는 방법을 사용해야 겠네요 알 수 없는 사용자 2019.9.6 10:37

4 답변

  • pandas 를 이용하는 방법입니다.

    >>> import pandas as pd
    
    >>> grades = [
                 ['Student', 'Quiz 1', 'Quiz 2', 'Quiz 3'],
                 ['Joe', 100, 90, 80],
                 ['McD', 88, 99, 111],
                 ['Ruta', 50, 56, 67],
                 ['Kang', 60, 62, 67],
                 ['Samanda', 70, 79, 88],
                 ['Mina', 98, 99, 100]]
    >>> df = pd.DataFrame(grades[1:], columns=grades[0])
    >>> df
       Student  Quiz 1  Quiz 2  Quiz 3
    0      Joe     100      90      80
    1      McD      88      99     111
    2     Ruta      50      56      67
    3     Kang      60      62      67
    4  Samanda      70      79      88
    5     Mina      98      99     100
    >>> df['Average'] = df.apply(lambda row:(row['Quiz 1']+row['Quiz 2']+row['Quiz 3'])/3, axis=1)
    >>> df
       Student  Quiz 1  Quiz 2  Quiz 3    Average
    0      Joe     100      90      80  90.000000
    1      McD      88      99     111  99.333333
    2     Ruta      50      56      67  57.666667
    3     Kang      60      62      67  63.000000
    4  Samanda      70      79      88  79.000000
    5     Mina      98      99     100  99.000000
    >>> 
    
    • 정말 감사드립니다 ㅎㅎ panda를 사용하는 방법이 가장 편한방법인가요? 그렇다면 공부를 좀 해봐야겠군요 알 수 없는 사용자 2019.9.6 13:32
    • 가장 편한 방법은 아닐 수도 있어요. 테이블형태의 자료를 이케저케 조작(평균내고, 소팅하고, 그래프그리고, 등등)하는 데에는 확실히 편리한 방법이고요. 그냥 숙제라면 더 간단하게 for 루프에서 처리하는 게 더 쉽고 그렇죠. nowp 2019.9.6 14:49
    • 혹시 평균값들만을 리스트로 출력시키려면 어떤 방법이 있을까요? 위의 예시를 들자면 [90, 99, 57, 63, 79, 99]이런 식으로요 알 수 없는 사용자 2019.9.6 16:53
    • df.Average : pandas series, df.Average.values : numpy array, list(df.Average.values) : 리스트 nowp 2019.9.6 20:00
    • df.iloc[:, 4].tolist() 하시면 됩니다 알 수 없는 사용자 2019.9.6 21:33
    • 정말 감사드립니다! 알 수 없는 사용자 2019.9.7 06:18
  • dictionary를 이용한 방법

    grades = []
    
    grades.append({'student':'Joe', 'Quiz 1':100, 'Quiz 2':90, 'Quiz 3':80})
    grades.append({'student':'McD', 'Quiz 1':88, 'Quiz 2':99, 'Quiz 3':111})
    grades.append({'student':'Ruta', 'Quiz 1':50, 'Quiz 2':56, 'Quiz 3':67})
    grades.append({'student':'Kang', 'Quiz 1':60, 'Quiz 2':62, 'Quiz 3':67})
    grades.append({'student':'Samanda', 'Quiz 1':70, 'Quiz 2':79, 'Quiz 3':88})
    grades.append({'student':'Mina', 'Quiz 1':98, 'Quiz 2':99, 'Quiz 3':100})
    
    for list in grades:
        print ('average of student', list.get('student'), (list.get('Quiz 1') +list.get('Quiz 2')+list.get('Quiz 3'))/3 )
    
    
    >>>
    average of student Joe 90.0
    average of student McD 99.33333333333333
    average of student Ruta 57.666666666666664
    average of student Kang 63.0
    average of student Samanda 79.0
    average of student Mina 99.0
    
  • 하기와 같이 dictionary comprehension 을 이용할 수 있습니다.

    grades = [
                 ['Student', 'Quiz 1', 'Quiz 2', 'Quiz 3'],
                 ['Joe', 100, 90, 80],
                 ['McD', 88, 99, 111],
                 ['Ruta', 50, 56, 67],
                 ['Kang', 60, 62, 67],
                 ['Samanda', 70, 79, 88],
                 ['Mina', 98, 99, 100]]
    
    {row[0] : sum(row[1:]) / len(row[1:]) for row in grades[1:]}
    
    {'Joe': 90.0,
     'McD': 99.33333333333333,
     'Ruta': 57.666666666666664,
     'Kang': 63.0,
     'Samanda': 79.0,
     'Mina': 99.0}
    
  • pandas나 dictionary로 변경하지 않고 주어진 List를 참조하여 계산해 보았습니다.

    이미지

    주피터 노트북으로 실행한 결과 입니다.

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

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

(ಠ_ಠ)
(ಠ‿ಠ)