관리 메뉴

솜씨좋은장씨

[Python] str 형식의 list 문자열 list 형식으로 변환하는 방법 ( str list to list python ) 본문

Programming/Python

[Python] str 형식의 list 문자열 list 형식으로 변환하는 방법 ( str list to list python )

솜씨좋은장씨 2020. 11. 2. 15:43
728x90
반응형

업무 중 NER을 담당하는 분께 NER을 활용하여 특정 태스크에 대해서 테스트를 요청드렸었고

결과로 받은 파일은 

 'INPUT : 롤플레잉 게임 시스템 쇼크를 개발한 회사는\n',
 "GOLD : ['O', 'O', 'B-SUB', 'I-SUB', 'O', 'O']\n",
 "PRED : ['B-EXP', 'I-EXP', 'B-SUB', 'I-SUB', 'O', 'O']\n",
 'CONF : [0.99205834 0.99542373 0.9999639  0.999987   0.99999595 0.9999968 ]\n',

이렇게 NER을 거쳐 나온 결과들이 string 형식으로 한줄한줄 적혀 있는 txt 파일 형식이었습니다.

 

여기서 NER 모델이 예측해서 뽑아낸 결과를 B-SUB, I-SUB, B-EXP, I-EXP를 통해 찾아내기 위해서는

"PRED : ['B-EXP', 'I-EXP', 'B-SUB', 'I-SUB', 'O', 'O']\n",

이렇게 한 줄로 나와있는 결과에서

"['B-EXP', 'I-EXP', 'B-SUB', 'I-SUB', 'O', 'O']"

이 부분만 뽑아서 list 모양을 하고 있는 str을 아래와 같은 진짜 리스트 형식으로 변환 해야 했습니다.

['B-EXP', 'I-EXP', 'B-SUB', 'I-SUB', 'O', 'O']

 

이 글에서는 list의 모양을 하고 있는 문자열을 list로 변환하는 방법에 대해서 적어보려합니다.

 

첫 번째 방법

첫 번째 방법은 ast라는 라이브러리를  활용하는 방법입니다.

방법은 다음과 같습니다.

import ast

x = "['B-EXP', 'I-EXP', 'B-SUB', 'I-SUB', 'O', 'O']"
x = ast.literal_eval(x)
print(x)
['B-EXP', 'I-EXP', 'B-SUB', 'I-SUB', 'O', 'O']

 

두 번째 방법

두 번째 방법은 json 라이브러리를 활용하는 방법입니다.

방법은 다음과 같습니다.

import json

x2 = '["O", "O", "B-SUB", "I-SUB", "O", "O", {"HI":"JHI"}]'
x2 = json.loads(x2)
print(x2)
['O', 'O', 'B-SUB', 'I-SUB', 'O', 'O', {'HI': 'JHI'}]

두 번째 방법에서는 이상하게도 

전체 list 모양 문자열을 감싸고 있는 문자가 ' 가아니고 각 문자를 감싸고 있는 문자가 " 가 아니면

---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-48-7d74a965bb1a> in <module>
     17 x2 = json.loads(x2)
     18 x22 = "['O', 'O', 'B-SUB', 'I-SUB', 'O', 'O', {'HI':'JHI'}]"
---> 19 x3 = json.loads(x22)
     20 x, x2, x2_new, x3

~/anaconda3/lib/python3.7/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    346             parse_int is None and parse_float is None and
    347             parse_constant is None and object_pairs_hook is None and not kw):
--> 348         return _default_decoder.decode(s)
    349     if cls is None:
    350         cls = JSONDecoder

~/anaconda3/lib/python3.7/json/decoder.py in decode(self, s, _w)
    335 
    336         """
--> 337         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    338         end = _w(s, end).end()
    339         if end != len(s):

~/anaconda3/lib/python3.7/json/decoder.py in raw_decode(self, s, idx)
    353             obj, end = self.scan_once(s, idx)
    354         except StopIteration as err:
--> 355             raise JSONDecodeError("Expecting value", s, err.value) from None
    356         return obj, end

JSONDecodeError: Expecting value: line 1 column 2 (char 1)

위와 같은 오류가 발생하였습니다.

오류에 더 자유롭게 사용하시고 싶으신 분들은 첫 번째 ast 라이브러리를 활용하는 방법을 추천드립니다.

 

읽어주셔서 감사합니다.

Comments