Замена ключей для уникальных значений в словаре в Python - PullRequest
0 голосов
/ 11 декабря 2010
a = {0: 'PtpMotion', 1: 'PtpMotion', 2: 'LinMotion', 3: 'LinMotion', 4: 'LinMotion', 5: 'LinMotion', 6: 'LinMotion', 7: 'LinMotion', 8: 'LinMotion', 9: 'PtpMotion', 10: 'LinMotion', 11: 'Wait'}
b = {}
for key, val in a.items():
    b[val] = key
print b

То, что я пытаюсь сделать, это поменять значение словаря на ключ.Но используя этот код, я теряю некоторую информацию из словаря, получая этот вывод:

{'LinMotion': 10, 'PtpMotion': 9, 'Wait': 11}

Почему это происходит?

Ответы [ 4 ]

4 голосов
/ 11 декабря 2010

Каждый ключ может встречаться в словаре только один раз.Вы можете сохранить список индексов для каждой клавиши:

import collections
b = collections.defaultdict(list)
for key, val in a.iteritems():
    b[val].append(key)
print b
# {'LinMotion': [2, 3, 4, 5, 6, 7, 8, 10], 'PtpMotion': [0, 1, 9], 'Wait': [11]}

Редактировать: Как указано в комментариях ecik, вы также можете использовать defaultdict(set) (и использовать .add() вместо .append()в цикле).

2 голосов
/ 11 декабря 2010

Когда вы говорите

b[val] = key

и val уже существует, он отменяет настройку, получая то, что вы видите.Чтобы получить все значения, вы должны отобразить исходные значения в списки ключей, такие как

from collections import defaultdict

b = defaultdict(list)
for key, val in a.items():
    b[val].append(key)
print b

Когда я это делаю (python 2.5.1), я получаю

defaultdict(<type 'list'>, {'LinMotion': [2, 3, 4, 5, 6, 7, 8, 10], 
                            'PtpMotion': [0, 1, 9], 
                            'Wait': [11]})
1 голос
/ 11 декабря 2010

Ключи словаря должны быть уникальными.Если вы хотите сохранить их все, вам нужно создать каждое значение для b[val] списка и добавить значения в эти списки.

0 голосов
/ 11 декабря 2010

Возможно, вам нужны списки в словаре вывода:

from collections import defaultdict
a = {0: 'PtpMotion', 1: 'PtpMotion', 2: 'LinMotion', 3: 'LinMotion', 4: 'LinMotion', 5: 'LinMotion', 6: 'LinMotion', 7: 'LinMotion', 8: 'LinMotion', 9: 'PtpMotion', 10: 'LinMotion', 11: 'Wait'}
b = defaultdict(list)
for key, val in a.items():
    b[val].append(key)
print b

выход:

defaultdict(<type 'list'>, {'LinMotion': [2, 3, 4, 5, 6, 7, 8, 10], 'PtpMotion': [0, 1, 9], 'Wait': [11]})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...