儘管答案已被接受,但我想我會引用一個關於如何使用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
你可以看到,當你的循環得到更大的它真的有差別。
來源
2012-02-01 23:13:32
jdi
我剛試過這個,它工作正常。請舉例說明實際的錯誤併發布 - 這些頻繁的編輯有點瘋狂。 – 2012-02-01 22:59:57
它適用於我 – RanRag 2012-02-01 23:00:52
我認爲這裏有一些缺少的信息。 'foo'顯然是某種django Query對象,或者是一個像defaultdict一樣運行的pymongo包裝,並且返回None作爲缺少的鍵。添加ascii和unicode沒有任何問題(儘管在循環中它不好,你應該加入)。 'resolve'顯然是None,你需要檢查你的值。 – jdi 2012-02-01 23:03:46