2010-06-29 40 views
1

如何使用另一個字典的鍵和一組值來創建另一個字典?什麼是從另一個字典的鍵和值數組創建詞典的優雅方式?

我想過這樣做:

zipped = zip(theExistingDict.keys(), arrayOfValues) 
myNewDict = dict(zipped) 

然而,這並不完全工作,從arrayOfValues每個值都與所產生的字典任意鍵配對。我無法控制arrayOfValues中的哪個元素與theExistingDict.keys()中的哪個鍵配對。

theExistingDict看起來是這樣的:

{u'actual bitrate': 4, u'Suggested Bitrate': 3, u'title': 2, u'id': 1, u'game slot': 0}

arrayOfValues看起來是這樣的:

1.0, u'GOLD_Spider Solitaire', u'Spider\\nSolitaire', 120000.0, 120000.0

所以:我想arrayOfValues[0]映射到game slot(因爲在字典中它的價值0)。

有沒有一種簡單而優雅的方式來做到這一點?

+2

好了,你想有什麼順序?那麼鍵和值之間的連接又是什麼? – SilentGhost 2010-06-29 15:11:31

+0

'theExistingDict.keys()'將以任意順序爲您提供密鑰。您可能需要以某種方式對其進行排序。只有你知道哪些鍵值對屬於一起。 – 2010-06-29 15:11:58

+0

@SilentGhost - 請參閱我上面的編輯。 – BeeBand 2010-06-29 15:43:54

回答

4

由於現有的字典本身就包含在列表中的元素的位置的信息:你可以這樣做:

>>> exist = {u'title': 2, u'actual bitrate': 4, u'id': 1, u'game slot': 0, u'Suggested Bitrate': 3} 
>>> l = [1.0, u'GOLD_Spider Solitaire', u'Spider\\nSolitaire', 120000.0, 120000.0] 
>>> dict((k, l[v]) for k, v in exist.iteritems()) 
{u'Suggested Bitrate': 120000.0, u'game slot': 1.0, u'actual bitrate': 120000.0, u'id': u'GOLD_Spider Solitaire', u'title': u'Spider\\nSolitaire'} 

或py3k /蟒蛇2.7+:

>>> {k: l[v] for k, v in exist.items()} 
{'Suggested Bitrate': 120000.0, 'game slot': 1.0, 'actual bitrate': 120000.0, 'id': 'GOLD_Spider Solitaire', 'title': 'Spider\\nSolitaire'} 
+0

非常優雅 - 這是我尋找的解決方案,謝謝! – BeeBand 2010-06-29 19:29:26

4

正如其他人所提到的,字典中沒有任何定義的順序。 python文檔說:「鍵和值以非隨機的任意順序列出,因Python實現而異,並取決於字典的插入和刪除歷史。」

如果您希望使用將項目添加到字典中的原始順序,則可以嘗試查找保留此順序的字典的替代實現 - 例如, http://www.voidspace.org.uk/python/odict.html

0

也許更多的東西一樣:

from operator import itemgetter 
zip(array_of_values, [ a for a, _ in sorted(existing_dict.iteritems(), key=itemgetter(1)) ]) 

可以進一步修改,如果你想與整數匹配指數,可能與未使用的值...

zipped = [ (k, a) for i, a in enumerate(array_of_values) for k, v in existing_dict.iteritems() if i == v ] 
new_dict = dict(zipped) 
相關問題