2012-02-01 3 views
2

좋아 .. 이것은 중복일지도 모르지만 나는 올바른 문제를 알지 못한다고 생각합니다. 나는 유니 코드로 문자열을 가지고 있다고 생각하고있다. (기본적으로 나는 몽고 db에서 읽고있다. 그리고 mongodb는 그 형태로 모든 것을 저장한다? 정직하게 나는 모른다. 그러나 이것은 내가 얻은 것이다.유니 코드에서 아스키 파이썬으로 변환

{ u'preview': u'Hello World!!'} 

그래서 모든 필드의 앞이 U '가 .. 나는 기본적으로 다음을 추출! 다음 하나의 거대한 문자열을 추가하려고 그래서 나는 뭔가 할 말을 할 수 있습니다 :.

string = '' 
resolve = foo['first_resolved_at'] 
string += resolve 

따라서 오류가 발생합니다.

TypeError: coercing to Unicode: need string or buffer, NoneType found 

내가 뭘 잘못하고 있니? 문자열로 변환해야한다고 생각합니다. ASCII로 감사

+2

방금 ​​시도했지만 제대로 작동합니다. 실제 오류를 표시하고 게시하는 예를 만드십시오. 이러한 자주 수정되는 사항은 다소 미흡합니다. –

+0

그것은 나를 위해 잘 작동 – RanRag

+1

여기에 몇 가지 누락 된 정보가 있다고 생각합니다. 'foo'는 분명히 django Query 객체 또는 pymongo 래퍼 일종의 defaultdict처럼 작동하며 누락 된 키에 대해 None을 반환합니다. 아스키와 유니 코드를 추가하는 데는 아무런 문제가 없습니다 (루프가 좋지 않아도 가입해야합니다). 'resolve'는 분명히 None이므로 값을 확인해야합니다. – jdi

답변

2

답변이 받아 들여졌지만, 문자열을 함께 추가하는 대신 join()을 사용하는 방법에 대한 예제를 참조로 포함시킬 것입니다. 이것은 또한을 보여줍니다 그것의 피할 수 없음 값 없음 : 여기

keys = ('c', 'g', 'f', 'm') 
''.join([v for v in (d[k] for k in keys) if v is not None]) 

이 차이를 보여주는 테스트입니다 :

d = {u'a': u'a', u'c': None, u'b': u'b', u'e': None, u'd': None, u'g': u'g', u'f': u'f', u'i': u'i', u'h': u'h', u'k': u'k', u'j': u'j', u'm': None, u'l': u'l', u'o': u'o', u'n': None, u'p': u'p'} 

resolve = ''.join((value for value in d.itervalues() if value is not None)) 
print resolve 
# u'abgfihkjlop' 

을 그리고 당신이하고 싶었던 만 루프는 키 소정 집합에 있다면 접근 목록에 추가, 함께 문자열을 추가 :

from time import time 

d = {} 
for i in xrange(1000): 
    v = u'v%d' % i 
    d[v] = v 

def test1(): 
    return ''.join(v for v in d.itervalues() if v is not None) 

def test2(): 
    result = [] 
    for v in d.itervalues(): 
     if v is not None: 
      result.append(v) 
    return ''.join(result) 

def test3(): 
    result = '' 
    for v in d.itervalues(): 
     if v is not None: 
      result += v 
    return result 

def timeit(fn): 
    start = time() 
    r = fn() 
    end = time() - start 
    print "Sec:", end, "msec:", end*1000 


>>> timeit(test1) 
Sec: 0.000195980072021 msec: 0.195980072021 
>>> timeit(test2) 
Sec: 0.000204086303711 msec: 0.204086303711 
>>> timeit(test3) 
Sec: 0.000397920608521 msec: 0.397920608521 

당신은 당신의 루프가 커질 때 정말 차이가 있음을 볼 수 있습니다.

1

유니 코드는 str(some_unicode_string)

이 {u'preview 'u'Hello 세계 !!'}입니다

이 맵입니다. 위에 루프 내용을 얻을 수 있습니다 :

keys=[] 
values=[] 
for i in mymap: 
    print i 
    print "contains:",mymap[i] 
    keys.append(i) 
    values.append(i) 

하거나 mymap.keys()mymap.values()

그래서 나는 당신의 모든 문자열을 변환하지한다고 생각합니다. 당신이 원한다면 그러나 단지 str(q)

편집 :

이제 편집 한 후 귀하의 예제 코드가 작동합니다. 이것이 유용했기를 바랍니다.

+0

편집 됨. 미안합니다 ... 혼동 – Fraz

+0

확실합니다. 여전히 동일하게 답변합니다. –

관련 문제