Скажем, у меня есть такой словарь:
my_dict = {2:3, 5:6, 8:9}
Есть ли способ, которым я могу переключать ключи и значения, чтобы получить:
{3:2, 6:5, 9:8}
Скажем, у меня есть такой словарь:
my_dict = {2:3, 5:6, 8:9}
Есть ли способ, которым я могу переключать ключи и значения, чтобы получить:
{3:2, 6:5, 9:8}
my_dict2 = dict((y,x) for x,y in my_dict.iteritems())
Если вы используете python 2.7 или 3.x, вы можете использовать понимание словаря:
my_dict2 = {y:x for x,y in my_dict.iteritems()}
Изменить
Как отмечено в комментариях JBernardo, для python 3.x вам нужно использовать items
вместо iteritems
Попробуйте следующее:
my_dict = {2:3, 5:6, 8:9}
new_dict = {}
for k, v in my_dict.items():
new_dict[v] = k
Используйте этот код (тривиально измененный) из принятого ответа на Python обратный/инвертированный сопоставление:
dict((v,k) for k, v in my_dict.iteritems())
Обратите внимание, что это предполагает, что значения в оригинальном словаре уникальны. В противном случае вы получите дубликаты ключей в результирующем словаре, и это недопустимо.
И, как указывает @wim, он также предполагает, что значения хешируются. См. глоссарий Python, если вы не уверены в том, что есть и не хешируется.
может быть:
flipped_dict = dict(zip(my_dict.values(), my_dict.keys()))
Иногда условие, что все значения уникальны, не будет выполняться, и в этом случае ответы выше будут уничтожать любые повторяющиеся значения.
Ниже перечислены значения, которые могут быть дублированы в список:
from itertools import count
dict([(a,[list(d.keys())[i] for i,j in zip(count(), d.values())if j==a in set(d.values())])
Я уверен, что есть лучший (не-list-comp) метод, но у меня была проблема с более ранними ответами, поэтому я подумал, что предоставил бы мое решение, если другие имеют аналогичный вариант использования.
P.S. Не ожидайте, что дикт останется аккуратно организованным после любых изменений оригинала! Этот метод является одноразовым использованием только на статическом dict - вы были предупреждены!
my_dict = { my_dict[k]:k for k in my_dict}
Прежде всего, это не гарантируется, что это возможно, так как значения словаря могут быть неосязаемыми.
Если это не так, мы можем использовать функциональный подход с:
reversed_dict = dict(map(reversed, original_dict.items()))
Если значения не являются уникальными, это приведет к конфликту пространства ключей при конвертации. Лучше всего держать ключи в списке при переключении мест
ниже обрабатывает это -
RvsD = dict()
for k,v in MyDict.iteritems():
RsvD.setdefault(v, []).append(k)
Вы можете сделать это так:
Функция:
def inverse_dict(my_dict):
updated_dict = {}
for i in my_dict:
updated_dict[my_dict[i]] = [i]
return updated_dict
Главный():
def main():
year = {'day': 15, 'month': 3, 'year': 2019}
print(inverse_dict(year))
if __name__ == "__main__":
main()
Ouput:
{15: ['day'], 3: ['month'], 2019: ['year']}
Если значения не являются уникальными в словаре, вы можете сопоставить ключи с этим значением. Вот пример того, как это сделать, используя defaultdict
from collections import defaultdict
def reverse_dict(data: dict) -> dict:
rd = defaultdict(list)
for k, v in data.items():
rd[v].append(k)
return rd
if __name__ == "__main__":
from collections import Counter
data = "aaa bbb ccc ddd aaa bbb ccc aaa"
c = Counter(data.split())
print(c)
# Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
rd = reverse_dict(c)
print(rd)
# defaultdict(<class 'list'>, {3: ['aaa'], 2: ['bbb', 'ccc'], 1: ['ddd']})