如何使用另一个字典的键和值数组创建另一个字典?
我想过这样做:
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)。
有一种简单而优雅的方法吗?
答案 0 :(得分:4)
正如其他人所提到的,词典中没有定义任何顺序。 python文档说,“键和值以任意顺序列出,非随机,在Python实现中各不相同,并且取决于字典的插入和删除历史。”
如果您希望使用将项目添加到词典中的原始订单,您可以尝试寻找保留此订单的字典的替代实现 - 例如http://www.voidspace.org.uk/python/odict.html
答案 1 :(得分: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 / python 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'}
答案 2 :(得分:0)
根据上述评论,theExistingDict
的字典可能不是您正在寻找的结构。
您可能对ordered dictionary感兴趣。
另见"What’s the way to keep the dictionary parameter order in Python?"
的答案答案 3 :(得分: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)