2016-07-12 2 views
0

저는 사전을 반복하고 개행 문자를 제거하고 항목을 파싱하는 데 어려움을 겪고 있습니다. 개행 문자를 제거하는 동안 dict를 반복하는 방법은 무엇입니까?

우리가

line_contents = {"user_id": "6GrH6gp09pqYykGv86D6Dg", "text": "Decent selection of more than just bar food. \n\nJumbo fish sandwich is aptly named. \n\nSeem to be generous with the pour.", "business_id": "fNGIbpazjTRdXgwRY_NIXA", "likes": 0, "date": "2013-04-22", "type": "tip"} 

#I've tried: 
line_contents=dict(map(strip(),x) for x in line_contents.items()) 
#but^doesn't work. I can't figure out how the map function or the dictionary comprehension works 

#I eventually want: 
line_contents = {"user_id": "6GrH6gp09pqYykGv86D6Dg", "text": "Decent selection of more than just bar food. Jumbo fish sandwich is aptly named. Seem to be generous with the pour.", "business_id": "fNGIbpazjTRdXgwRY_NIXA", "likes": 0, "date": "2013-04-22", "type": "tip"} 

나는 전형적인 for 루프와 사전 요소를 반복하는 유혹 해요하지만 난 결코로 DICT 이해를 시도하려는 말해봐.

답변

4

사실, 사전 이해력을 사용하고 있지 않습니다. 그것은 하나의 인자를 가진 함수 호출입니다 : 생성자 표현식. 사전 적 이해는 더 같이 될 것이다 :

line_contents = {key: value.replace("\n", "") for key, value in line_contents.items()} 

편집 : niemmi는 값이 모든 문자열이 아니라는 것을 좋은 지적을했다. 따라서, 당신은 그의 제안에 유사한 것을 사용한다 :

line_contents = {k: v.replace("\n", "") if isinstance(v, basestring) else v for k,v in line_contents.items()} 

나는 basestring 대신 niemmi의 str을 사용 실제로 유니 코드 때문이다. Python 3에서는 str을 사용해야합니다.

당신의 문제는 무엇입니까? 음, dict 한 가지 인수를 제공하고 있습니다. 이것을 고려하십시오 :

argument = [] 
for x in line_contents.items(): 
    argument.append(map(strip(), x)) 

line_contents = dict(argument) 

그것은 당신이하고있는 일입니다. 각 키 - 값 쌍에 대해 두 개의 인수 strip()x을 제공하고 있습니다. map(strip(), x) 중 하나 전화를 들어, 당신은이 일을 적용됩니다 :

function = strip() 
result = [] 
for item in x: 
    result.append(function(item)) 

지금 문제를 참조해야합니다. 한 가지 들어, strip 정의되지 않았습니다. 또 다른 한가지는 함수가 반환하는 것이 아니라 map에 함수를 제공해야한다는 것입니다. 당신이 str.strip를 사용하고 싶다면, 이런 식으로 작업을 수행합니다

map(str.strip, x) 

그의 문제는 끝에서 str.strip() 스트립이; 중간에 나타나는 새 행은 제거되지 않습니다.

+0

이상하게도 작동하지 않는 것 같습니다. 'print line_contents'의 인쇄 라인을 사전 보충 라인 바로 앞에있는 사전 라인에 삽입하면, 원시 문자열이라고 생각되는 것을 보여줍니다 :'{u'user_id ': u'6GrH6gp09pqYykGv86D6Dg', u'text ': u' 바 음식 이상의 품위있는 선택. \ n \ n 점보 생선 샌드위치가 적절하게 명명되었습니다. \ n \ n 쏟아지는 관대함을 느껴보십시오. ', u'business_id': u'fNGIbpazjTRdXgwRY_NIXA ', u'likes : 0, u'date': u'2013-04-22 ', u'type': u 'tip'}'이것이 내가 여기서하려고하는 것에 어떤 영향을 주어야합니까? – simplycoding

+0

오류가 있습니까? 그것은 모든 것을 변화시키는 것이 아니라 어떤 것을 변화시키는 것입니까? 'u'는 원시 코드가 아닌 유니 코드를 의미합니다. 원래 문자열 인 경우 차이가 있지만 실제 문자열은 일반 문자열과 아무런 차이가 없습니다. "원시"는 그것이 어떻게 만들어 지는가를 의미합니다. – zondo

+0

오류가 없으면 다시 인쇄 할 때'\ n'이 사전에 계속 나타납니다. – simplycoding

3

당신은 DICT 이해를 사용할 수 있지만 일부 값 문자열되지 않기 때문에이를 고려해 있습니다

: 당신이 dict 내장을 사용할 수 있습니다 모두 키와 값은 줄 바꿈을 포함 할 경우

line_contents = {k: v.replace('\n', '') if isinstance(v, str) else v for k, v in line_contents.items()} 

물론

line_contents = dict([y.replace('\n', '') if isinstance(y, str) else y for y in x] 
        for x in line_contents.items()) 

DICT 이해는 여전히 작동 것이지만, 그것은 아주 지저분한 보일 것이다

line_contents = {k: v for k, v in 
       ([y.replace('\n', '') if isinstance(y, str) else y for y in x] 
        for x in line_contents.items()) 
       } 
+0

사전'line_contents'가 유니 코드로되어 있습니다. 그래서 그것은'line_contents = {u'user_id ': u'6GrH6gp09pqYykGv86D6Dg', u'text ': u''decent selection of bar food를 선택하는 것입니다. \ n \ n 점보 생선 샌드위치가 적절하게 명명되었습니다. \ n \ n 쏟아지는 관대함을 느껴보십시오. ', u'business_id': u'fNGIbpazjTRdXgwRY_NIXA ', u'likes : 0, u'date': u'2013-04-22 ', u'type': u '팁'}'. 유니 코드가 아니라면 제안은 분명히 효과가있었습니다. 이것에 대해 어떻게 생각하세요? – simplycoding

관련 문제