2017-01-09 2 views
0

유니 코드 개체 목록이 names이고 새 목록 parsed_names을 생성하려고하므로 하나의 이름을 가진 개체가 문자열로 변환되고 개체는 이름 목록은 문자열 목록으로 변환됩니다유니 코드 개체 목록을 문자열 목록으로 변환

다음 코드는 트릭을 수행하지만 난 오히려 다른 경우 뭔가 오류 ( ValueError: malformed string)를 잡아 잘못했다하지 않는 게 좋을
names = [u'Johnny', u'["Tamir", "Josh"]', u'Brad'] 
parsed_names = ['Johnny', ['Tamir', 'Josh'], 'Brad'] 

:

import ast 

names = [u'Johnny', u'["Tamir", "Josh"]', u'Brad'] 
parsed_names = [] 

for n in names: 
    try: 
     parsed_names.append(ast.literal_eval(name)) 
    except ValueError: 
     parsed_names.append(str(name)) 

print parsed_names 
# ['Johnny', ['Tamir', 'Josh'], 'Brad'] 

참고 : 내 최종 고아 내가 편평한 목록 (['Johnny', 'Tamir', 'Josh', 'Brad'])을 생산하는 것이지만 이미 그 코드를 가지고 있으며이 단계를 먼저 취해야한다고 생각합니다.

+0

그런 다음 코드에서 ' at all at –

+0

@PatrickHaugh 그는 문자열을 먼저 평가하므로 목록처럼 보이는 문자열이 목록으로 평가됩니다. 깔끔하게 평가하지 않는 모든 것은 문자열로 유지됩니다. – onlynone

+0

각 문자열을 평가하면 문제가 발생합니다. 누군가의 이름이 "참"이면 부울 값 "True"를 최종 목록에 추가합니다. 내장 또는 예약어와 일치하는 모든 "이름"은 문제가 발생할 것입니다. – onlynone

답변

1

당신은 하위 목록에 대한 append 대신 extend를 사용해야합니다 :

import ast 

parsed_names = [] 
for n in names: 
    try: 
     sub_list = ast.literal_eval(n) 
     parsed_names.extend(sub_list) 
    except ValueError: 
     parsed_names.append(str(n)) 

출력 : 당신이 try..except을 사용하지 않으려면

>>> parsed_names 
['Johnny', 'Tamir', 'Josh', 'Brad'] 

, 당신은 다음을 시도 할 수 있습니다 :

temp = [ast.literal_eval(n) if '[' in n else str(n) for n in names] 
# ['Johnny', ['Tamir', 'Josh'], 'Brad'] 

res = [] 

for item in temp: 
    if isinstance(item, list): 
     res.extend(item) 
    else: 
     res.append(item) 
+0

좋아요! 이것은 나의 두 번째 질문을 해결하지만 나는 여전히 오류 잡기에 대해 걱정하고있다. 다른 'ValueError'가 발생할 경우 –

+0

@ jcmetz21 제 수정 된 답변을 살펴보십시오. – ettanany