2015-05-04 108 views
2

我有一本字典,如下所示: -什麼是一個優雅的方式來將Python字典轉換爲逗號分隔的鍵字符串和逗號分隔值字符串?

dict={'a':'1','b':'2', 'c':'3'} 

要將其轉化成一個逗號分隔的鑰匙串key_string和逗號分隔值的字符串val_string我做到以下幾點: -

key_list=[] 
val_list=[] 

for key,value in dict.iteritems(): 
    key_list.append(key) 
    val_list.append(value) 

key_string = ','.join(key_list) 
val_string = ','.join(val_list) 

結果是

key_string = "a,b,c" 
val_string = "1,2,3" 

有沒有更高效/優雅的方式來做到這一點?

+0

你要「高效」或「優雅」?這兩者往往是交叉的目的。你的意思是「有效」,如「最短時間」或「最短臨時空間」或其他措施? – abarnert

+1

如果我告訴你'val_string =','。join(dict.values())',我相信你可以計算出另一個... – jonrsharpe

+0

這樣的事情? ','。join(map(lambda x:str(x),[1,2])) –

回答

6

明顯的解決方法就是使用iterkeysitervalues代替iteritems

key_string = ','.join(d.iterkeys()) 
val_string = ','.join(d.itervalues()) 

如果你擔心的鍵和值顯示在不同的順序了,而Python允許類型的字典以任何順序迭代他們想要的,它記錄here,如果你一遍又一遍地重複他們沒有做其他任何事情之間,你會得到相同的順序:

如果items()keys(),values(),iteritems(),iterkeys()itervalues()被調用時沒有對字典進行中間修改,這些列表將直接對應。

(2.7文檔一直沒有更新,這麼說,但它也確實爲viewitemsviewkeysviewvalues


至少在CPython的,它可能會稍微更有效使用keysvalues而不是iterkeysitervalues(因爲當給定迭代器時,str.join的CPython實現只是列表中的一個列表),但我懷疑這一點。正如Padraic Cunningham在評論中指出的那樣,對於密鑰(但不是數值),只需要list(d)而不是d.keys()(即使沒有,它可以避免LOAD_ATTR呼叫,但在成本爲LOAD_NAME,除非您首先將list複製到本地,因此它可以是LOAD_FAST ed)。


最後,如果你想與iteritems做到這一點(假設你正在使用,每次會隨機迭代順序破兼容不-相當的Python解釋器),你可以使用zip爲:

keys, values = zip(*d.iteritems()) 

將一對序列變成一對序列。

+0

您可以在不調用.iterkeys的情況下在d上調用「」.join(),雖然您已經說過像'list(d)會更有效率,也是在python 3腳本的不同運行可以改變鍵和值的順序,這是不同的行爲python 2. –

+0

@PadraicCunningham:是的,我想'','。join(list(d) )'可能是CPython 2.7中最高效的。如果任何人真的關心,我會測試所有的可能性,但我懷疑任何人的。無論如何,爲了與'itervalues()'並行,我認爲'iterkeys()'在這裏更具可讀性。 – abarnert

+0

@PadraicCunningham:對於運行之間的順序,實際上,Python絕對不會保證每次運行都會得到相同的順序。 2.7和3.4的命令幾乎完全相同。確實,CPython 3.4默認使用字符串散列隨機化,而2.7(和3.3)則不使用,但是然後Jython 2.5在每次運行中都會給你一個不同的順序,同時,有人說'dict'保持插入默認情況下,在CPython 3.5中(也許甚至需要它用於其他實現),所以這不是真正的Python 2與Python 3的東西。 – abarnert

8

使用str.join(iterable)(提示:不要命名您的字典dict):

d = {'a':'1', 'b':'2', 'c':'3'} 
print(",".join(d.keys())) 
print(",".join(d.values())) 

輸出:

c,a,b 
3,1,2 

需要注意的是一個字典裏沒有秩序。所以輸出也沒有任何可以依賴的順序。

1

你可以做這樣的:

key_string = ','.join(dict.keys()) 
val_string = ','.join(dict.values())