2011-03-06 30 views
5

我:的Python:郵編字典與鍵

list_nums = [1,18] 
list_chars = ['a','d'] 

我想:

list_num_chars = [{'num':1, 'char':'a'}, 
        {'num':18, 'char':'d'}] 

是否有一個更優雅的解決方案比:

list_num_chars = [{'num':a, 'char':b} for a,b in zip(list_nums, list_chars)] 
+4

您的解決方案已經很優雅,因爲它是Pythonic,易於閱讀和類似於輸出。我不確定你還可以要求什麼:p – Kai 2011-03-06 01:23:16

+0

你的意思是你想擁有一種「宏」,可以在任何這樣的列表上工作,而不必更改名稱;例如,如果您將它傳遞給「list_foo」,它將使用密鑰「foo」? – Vamana 2011-03-06 01:34:39

+0

@Vamana:不,不是那樣的。 – ash 2011-03-06 01:46:47

回答

2

如果最初的名單是很長期以來,您可能需要使用itertools.izip()而不是zip()來改善性能和減少內存使用量,但除此之外,我不能想到一個明顯「更好」的方式來做到這一點。

+0

好的,謝謝! – ash 2011-03-06 01:47:20

3
map(dict, map(lambda t:zip(('num','char'),t), zip(list_nums,list_chars))) 

給出:

[{'char': 'a', 'num': 1}, {'char': 'd', 'num': 18}] 
1

聲明一個新的變量,它的關鍵是你的字典

from itertools import izip 
nums = [1,18] 
chars = ['a','d'] 
keys = ["num", "char"]  # include list of keys as an input 

賦予一個稍微更優雅的解決方案,我想。

[dict(zip(keys,row)) for row in izip(nums,chars)] 

當有多個鍵(這就是爲什麼我開始打獵擺在首位:)

如果你想要這個解決方案,這樣的修改給出了同樣作爲發電機這絕對是更優雅:

(dict(zip(keys,row)) for row in izip(nums,chars))