[python] 목록의 문자열 표현을 목록으로 변환하는 방법은 무엇입니까?

string다음과 같은 목록을 다음으로 변환하는 가장 간단한 방법이 궁금 합니다 list.

x = u'[ "A","B","C" , " D"]'

사용자가 쉼표 사이에 공백을 넣고 따옴표 안에 공백을 넣는 경우에도 마찬가지입니다. 나는 그것을 처리해야합니다.

x = ["A", "B", "C", "D"] 

파이썬에서.

split 연산자를 사용하고 공백을 제거 strip()하고 split()알파벳이 아닌 것을 확인할 수 있다는 것을 알고 있습니다 . 그러나 코드는 매우 어려워졌습니다. 내가 모르는 빠른 기능이 있습니까?



답변

>>> import ast
>>> x = u'[ "A","B","C" , " D"]'
>>> x = ast.literal_eval(x)
>>> x
['A', 'B', 'C', ' D']
>>> x = [n.strip() for n in x]
>>> x
['A', 'B', 'C', 'D']

ast.literal_eval :

ast.literal_eval을 사용하면 표현식 노드 또는 Python 표현식이 포함 된 문자열을 안전하게 평가할 수 있습니다. 제공된 문자열 또는 노드는 문자열, 숫자, 튜플, 목록, dicts, 부울 및 없음과 같은 Python 리터럴 구조로만 구성 될 수 있습니다.


답변

json있을 때마다 모듈은 더 나은 솔루션입니다 캐릭터 라인 사전의 목록. 이 json.loads(your_data)기능을 사용하여 목록으로 변환 할 수 있습니다.

>>> import json
>>> x = u'[ "A","B","C" , " D"]'
>>> json.loads(x)
[u'A', u'B', u'C', u' D']

비슷하게

>>> x = u'[ "A","B","C" , {"D":"E"}]'
>>> json.loads(x)
[u'A', u'B', u'C', {u'D': u'E'}]


답변

eval위험하다 – 당신이 사용자 입력을 실행하지 않아야합니다.

2.6 이상인 경우 eval 대신 ast를 사용하십시오.

>>> import ast
>>> ast.literal_eval('["A","B" ,"C" ," D"]')
["A", "B", "C", " D"]

일단 당신이 그것을 strip문자열.

이전 버전의 Python을 사용하는 경우 간단한 정규식을 사용하여 원하는 것에 매우 가까이 갈 수 있습니다.

>>> x='[  "A",  " B", "C","D "]'
>>> re.findall(r'"\s*([^"]*?)\s*"', x)
['A', 'B', 'C', 'D']

이것은 ast 솔루션만큼 좋지 않습니다. 예를 들어 문자열에서 이스케이프 된 따옴표를 올바르게 처리하지 못합니다. 그러나 간단하고 위험한 평가를 포함하지 않으며 ast가없는 오래된 Python을 사용하는 경우 목적에 충분할 수 있습니다.


답변

import ast
l = ast.literal_eval('[ "A","B","C" , " D"]')
l = [i.strip() for i in l]


답변

빠른 해결책이 있습니다.

x = eval('[ "A","B","C" , " D"]')

목록 요소에서 원하지 않는 공백은 다음과 같이 제거 할 수 있습니다.

x = [x.strip() for x in eval('[ "A","B","C" , " D"]')]


답변

기본 파이썬 패키지에서 작동하는 위의 답변 중 일부에서 영감을 얻었습니다 (파이썬 3.7.3 사용).

방법 1 : ast

import ast
list(map(str.strip, ast.literal_eval(u'[ "A","B","C" , " D"]')))
# ['A', 'B', 'C', 'D']

import timeit
timeit.timeit(stmt="list(map(str.strip, ast.literal_eval(u'[ \"A\",\"B\",\"C\" , \" D\"]')))", setup='import ast', number=100000)
# 1.292875313000195

방법 2 : json

import json
list(map(str.strip, json.loads(u'[ "A","B","C" , " D"]')))
# ['A', 'B', 'C', 'D']

import timeit
timeit.timeit(stmt="list(map(str.strip, json.loads(u'[ \"A\",\"B\",\"C\" , \" D\"]')))", setup='import json', number=100000)
# 0.27833264000014424

방법 3 : 가져 오기 없음

list(map(str.strip, u'[ "A","B","C" , " D"]'.strip('][').replace('"', '').split(',')))
# ['A', 'B', 'C', 'D']

import timeit
timeit.timeit(stmt="list(map(str.strip, u'[ \"A\",\"B\",\"C\" , \" D\"]'.strip('][').replace('\"', '').split(',')))", number=100000)
# 0.12935059100027502

가독성이 가장 나쁜 방법을 고려한 결과가 최고의 성능을 가진 방법이라는 점에 실망했습니다. 가장 읽기 쉬운 옵션으로 갈 때 고려해야 할 장단점이 있습니다. 약간 더 성능이 좋은 옵션에 대한 가치 가독성이지만 평소와 같이 다릅니다.


답변

1 차원 목록 인 경우 아무 것도 가져 오지 않고 수행 할 수 있습니다.

>>> x = u'[ "A","B","C" , " D"]'
>>> ls = x.strip('[]').replace('"', '').replace(' ', '').split(',')
>>> ls
['A', 'B', 'C', 'D']