Дикт понимания от обратного диктата - PullRequest
0 голосов
/ 17 июня 2019

У меня есть следующие данные:

a = {1: {'data': 243}, 2: {'data': 253}, 4: {'data':243}}

И я хочу перевернуть их, чтобы ключ был значениями, а значения данных - ключами.Итак, сначала попробуйте:

b = dict(map(lambda id: (a[id]['data'], id, a))

Но когда я делаю это, 1 перезаписывается на 4, поэтому результат будет:

{243: 4, 253: 2}

Так что я хотел бы получитьструктура как это:

{243: [1, 4], 253: [2]}

Как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 17 июня 2019

Мне показалось, что приведенный ниже код является более читабельным и более простым способом решения вашей проблемы.

from collections import defaultdict

a = {1: {'data': 243}, 2: {'data': 253}, 4: {'data':243}}

result = defaultdict(list)
for k, v in a.items():
    result[v['data']].append(k)

print(result)

Выход:

defaultdict(<class 'list'>, {243: [1, 4], 253: [2]})
1 голос
/ 17 июня 2019

Это может быть сделано с пониманием dict и itertools.groupby(), но так как дикты не упорядочены, мы должны работать с отсортированным списком, потому что groupby ожидает предварительно отсортированный ввод.

from itertools import groupby

a = {1: {'data': 243}, 2: {'data': 253}, 4: {'data': 243}}

# key extractor function suitable for both sorted() and groupby()
keyfunc = lambda i: i[1]['data']

{g[0]: [i[0] for i in g[1]] for g in groupby(sorted(a.items(), key=keyfunc), key=keyfunc)}

здесь g - это группирующий кортеж (key, items), где

  • g[0] - это то, что keyfunc извлекает (в данном случае значение 'data'), и
  • g[1] - это итерация по элементам dict, т. Е. (key, value) кортежам, отсюда дополнительное понимание списка для извлечения только ключей.

result:

{243: [1, 4], 253: [2]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...