Какой элегантный способ создать словарь из ключей другого словаря и массива значений? - PullRequest
1 голос
/ 29 июня 2010

Как я могу создать другой словарь, используя ключи другого словаря и массив значений?

Я думал об этом:

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).

Есть ли простой и элегантный способ сделать это?

Ответы [ 4 ]

4 голосов
/ 29 июня 2010

Поскольку ваш существующий словарь сам содержит информацию о позициях элементов в списке: вы можете сделать:

>>> 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'}
4 голосов
/ 29 июня 2010

Как уже упоминалось, словарь не имеет определенного порядка в нем.Документы Python говорят: «Ключи и значения перечислены в произвольном порядке, который не является случайным, варьируется в зависимости от реализации Python и зависит от истории вставок и удалений словаря».

Если вы ищетеИспользуя исходный порядок добавления элементов в словарь, вы можете попробовать найти альтернативную реализацию словаря, которая сохраняет этот порядок - например, http://www.voidspace.org.uk/python/odict.html

0 голосов
/ 29 июня 2010

возможно, что-то более похожее на:

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)
0 голосов
/ 29 июня 2010

В свете вышеприведенных комментариев вполне возможно, что словарь для theExistingDict может не соответствовать структуре, которую вы ищете.

Возможно, вас заинтересует упорядоченный словарь .

См. Также ответы на «Как сохранить порядок параметров словаря в Python?»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...