2012-02-01 148 views
2

好的..這可能是重複的..但我不認爲我甚至知道正確的問題。 我猜我在unicode中有一個字符串..(基本上我正在讀取mongo分貝..和mongodb存儲所有的形式????老實說,我不知道..但這是我得到..從unicode轉換爲ascii python

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

所以這款U」中的所有字段的前.. 我基本上是試圖提取這些了!然後在一個巨大的字符串追加他們 所以可以說我做這樣的事情:

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

因此它會拋出一個錯誤

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

我在做什麼錯? 我想我必須將其轉換爲一個字符串..但如何? 感謝

+2

我剛試過這個,它工作正常。請舉例說明實際的錯誤併發布 - 這些頻繁的編輯有點瘋狂。 – 2012-02-01 22:59:57

+0

它適用於我 – RanRag 2012-02-01 23:00:52

+1

我認爲這裏有一些缺少的信息。 'foo'顯然是某種django Query對象,或者是一個像defaultdict一樣運行的pymongo包裝,並且返回None作爲缺少的鍵。添加ascii和unicode沒有任何問題(儘管在循環中它不好,你應該加入)。 'resolve'顯然是None,你需要檢查你的值。 – jdi 2012-02-01 23:03:46

回答

2

儘管答案已被接受,但我想我會引用一個關於如何使用join()而不是將字符串添加到一起的示例。這也顯示了其避免無值:

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' 

如果你想要做的只是環比預定的一組按鍵:

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

下面是本之間的差異測試方法,附加到一個列表,並添加字符串連接在一起:

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

的Unicode爲ASCII只是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 2012-02-01 22:55:08

+0

肯定。答案還是一樣的(只是跟着你的編輯) – 2012-02-01 22:58:39