2009-12-15 107 views

回答

10

沒有理由在這裏使用列表理解。

Python 3.x都有:

for k,v in mydict.items(): 
    print(k, '=', v) 

的Python 2.x的:

for k,v in mydict.iteritems(): 
    print k, '=', v 

,因爲在另一個答案由OP評論編輯:

如果你傳遞到一個函數,而不是在這裏打印它,那麼你應該只傳遞生成器到函數或字典本身,讓函數處理它需要做的任何事情h it。

這比將它轉換爲不需要的範圍內的字符串要好得多。該功能應該這樣做,因爲這就是它的用處。

我做了一個包裝函數,因爲編輯主函數是不成問題的。

def log_wrap(mydict): 
    mystr = '\n'.join(['%s = %s' % (k,v) for k,v in mydict.iteritems()]) 
    write_to_log(mydict) 

log_wrap(mydict) 
+0

我看不出有任何的命名空間在這裏。你的意思是「範圍」? – 2009-12-15 23:35:02

+0

我傳遞給它的函數來自我無法更改的日誌記錄模塊。 – randomThought 2009-12-15 23:45:22

+0

@Pavel - 是的,我做到了。 :P @Jaelebi - 那麼你幾次將相同的字符串傳遞給同一個日誌記錄函數?爲什麼? – 2009-12-15 23:48:15

2

像這樣:

DATA = {'key1': 'value1', 'key2': 'value2'} 
print "\n".join(sorted(["%s = %s" % (k,v) for (k,v) in DATA.iteritems()])) 
8
print '\n'.join('%s = %s' % (key, value) for key, value in d.iteritems()) 
3

明確優於隱式

列表理解是一個way to create list,而不是爲了避免環路。
從PEP 202:

列表解析提供了更簡潔 方式 情況來創建列表,其中圖()和過濾器() 和/或嵌套的循環將被當前 使用。

所以你應該問自己:
什麼時候在Python中創建這個代碼有用?它可能更緊湊,但代碼被讀取的次數比寫入次數多,所以它的優點是什麼?

Tor Valamo的解決方案雖然沒有在原始請求中提出要求,但在我看來,它更具可讀性,因此因此應該是首選。問題更新
str.join

編輯是實現從列表中快速拼接的好辦法 - 和回覆來自納迪亞和Ritchie是如何使用它的好例子。
再次,我會而不是在一行中執行所有的事情,但我會分裂它在各個步驟,以強調可讀性。

+0

我稍微編輯後就取消了我的回答。起初我把它作爲一個tupled列表,所以這是錯誤的。 – 2009-12-15 23:05:27

+0

我想要這個方法,因爲我想將完整的字符串傳遞給一個函數。在直接循環的情況下,我不得不連接它或使用stringIO函數。我需要這麼做很多次 – randomThought 2009-12-15 23:18:54

+0

你的問題是「我怎樣才能打印出格式化的字典......」這就是我們所回答的。如果你需要它來做其他事情,那麼你應該解釋這種情況,因爲也可能有其他優化。 – 2009-12-15 23:25:28

0

我更喜歡Python的方式:

mydict = {'a':1, 'b':2, 'c':3} 
for (key, value) in mydict.items(): 
    print key, '=', value 
+1

mydict.iteritems()對於巨大的字典會更好 – 2009-12-16 10:52:14