다양한 타입의 데이터를 포함하는 list가 string일 때 이를 온전히 list로 받으려면

조회수 457회
data = "[[10.82, 'C9 Hai', 'TSM Bjergsen', [], 9229, 8469], [16.286, 'C9 LemonNation', 'TSM WildTurtle', ['TSM Santorin', 'TSM Bjergsen', 'TSM Lustboy'], 13908, 5960]]"
print(type(data))

>>> <class 'str'>

이런 형태의 데이터를 지금 상태 온전히 list로서 사용하고 싶은데 무엇을 기준으로 분할해야 할지 감이 잡히지 않습니다. 이 데이터를 이용해 선수들의 KillDeathAssist 점수를 산출하려고 하는데, list in list의 첫번째 값이 시간, 두번째 값이 죽은 플레이어, 세번째 값이 킬을 올린 플레이어, 네번째 원소인 list는 킬에 기여를 한 플레이어들. 이런 식으로 순서가 정해진 데이터라 .count()를 사용하기에도 여의치 않아 질문드립니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 아래와 같이 해보세요.

    In [2]: data = "[[10.82, 'C9 Hai', 'TSM Bjergsen', [], 9229, 8469], [16.286, 'C9
       ...:  LemonNation', 'TSM WildTurtle', ['TSM Santorin', 'TSM Bjergsen', 'TSM L
       ...: ustboy'], 13908, 5960]]"
    
    In [3]: L = eval(data)                                                         
    
    In [4]: L                                                                      
    Out[4]: 
    [[10.82, 'C9 Hai', 'TSM Bjergsen', [], 9229, 8469],
     [16.286,
      'C9 LemonNation',
      'TSM WildTurtle',
      ['TSM Santorin', 'TSM Bjergsen', 'TSM Lustboy'],
      13908,
      5960]]
    
    In [5]: type(L)                                                                
    Out[5]: list
    
  • import ast
    
    data_s = "[[10.82, 'C9 Hai', 'TSM Bjergsen', [], 9229, 8469], [16.286, 'C9 LemonNation', 'TSM WildTurtle', ['TSM Santorin', 'TSM Bjergsen', 'TSM Lustboy'], 13908, 5960]]"
    
    data = ast.literal_eval(data_s)
    

    이렇게 하면, data 는 데이터row들의 리스트가 됩니다. 이 row 를 for 문으로 이터레이트해서, row[3] 에 특정한 유저가 있는지는 focus_user in row[3] 를 판단해 볼 수 있을 겁니다.

    def select_rows_by_killassist(user, data):
        return [ row for row in data if user in row[3]]  
    

    또는,

    import pandas
    
    df = pd.DataFrame(data, 
                      columns=["time", "killed", "killer", "killassist", "val1", "val2" ])
    

    이렇게 pandas dataframe 으로 만들어 놓고서 이런저런 조작을 해 볼 수 있을 거고요.

    특정 유저가 포함된 row 들만 셀렉드하는 건,

    user = 'TSM Santorin'
    rows_with_user = df.killerassist.apply(lambda lst: user in lst)
    
    df[rows_with_user == True]
    

    이런식으로 가능하고요.

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

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

(ಠ_ಠ)
(ಠ‿ಠ)