Как вы делаете значение из одного словаря ключом для нового словаря в Python? - PullRequest
0 голосов
/ 07 декабря 2018

Скажем, у меня есть словарь

dict{int: tuple(int, str)}

, и я хочу создать новый словарь в формате

dict{str: dict{int: int}}

вот пример того, что я пытаюсь получить:

d1 = {
    1: (22, 'this is a phrase'),
    2: (333, 'here is a sentence')
}

и через функцию мне нужно иметь возможность манипулировать этим первым словарем, чтобы получить мне второй:

d2 = {
    'this is a phrase': {1: 22},
    'here is a sentence': {2: 333},

     }

Извините за плохое форматирование и сумасшедшее описание того, что я пытался получить.Мне просто нужно простое описание того, как получить значения, чтобы стать ключами второго словаря.Надеюсь, это несколько яснее!

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018
d2 = {}
# we loop through all key: value pairs in the dict
for k, v in d1.items():
    # we unpack the tuple here
    num, newkey = v
    # we then create a new entry for the newkey if it does not exist
    if newkey not in d2:
        d2[newkey] = {}
    d2[newkey][k] = num

и это дает

{'this is a phrase': {1: 22}, 'here is a sentence': {2: 333}}

Отредактировано с учетом измененных требований в вопросе.

0 голосов
/ 07 декабря 2018

Перебирайте ключи в d1, чтобы получить значения, которые нужно разобрать.Для каждого значения переберите элементы в массиве value[2] и вставьте {value[0], value[1]} в d2 под каждым элементом.Присвоение d1[k1] временной переменной может облегчить чтение:

d2 = {}
for k1 in d1.keys():
    item = d1[k1]
    for k2 in item[2]:
        if k2 in d2:
          d2[k2].append({item[0]: item[1]})
        else:
          d2[k2] = [{item[0]: item[1]}]

Обратите внимание, что мы проверяем, есть ли ключ в d2 перед попыткой добавления;в противном случае Python пытается получить d2[k2] и выдает KeyError, когда k2 нет.

0 голосов
/ 07 декабря 2018

Предполагая, что порядок ваших данных соответствует, как в вашем вопросе, вы можете сделать следующее:

d1 = {
    1: (22, 'this is a phrase',['apple', 'grape']),
    2: (333, 'here is a sentence',['grape', 'cherry'])
}

d2 = {}

for key, values in d1.items():
    for food in values[-1]:
        if food not in d2:
            d2[food] = {}
        d2[food][values[0]] = [values[1]]

print d2

# Output: {'cherry': {333: ['here is a sentence']}, 'grape': {333: ['here is a sentence'], 22: ['this is a phrase']}, 'apple': {22: ['this is a phrase']}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...