Python 3.6: создайте новый dict, используя значения из другого в качестве индексов - PullRequest
0 голосов
/ 05 сентября 2018

В Python 3.6.3 у меня есть следующий dict D1:

D1 = {0: array([1, 2, 3], dtype=int64), 1: array([0,4], dtype=int64)}

Каждое значение в массиве является индексом ключа другого dict D2:

D2 = {'Jack': 1, 'Mike': 2, 'Tim': 3, 'Paul': 4, 'Tommy': 5}

Я пытаюсь создать третий дикт, D3, с теми же ключами, что и D1, и в качестве значений ключей D2, соответствующих индексам D1.values().

Результат, к которому я стремлюсь:

D3 = {0: ['Mike','Tim','Paul'], 1: ['Jack','Tommy']}

Мой подход частичен в том, что я пытаюсь выяснить, как сказать D3, чтобы получить ключи от D1 и значения от D2. Я не слишком уверен в этом and. Есть идеи?

D3 = {key:list(D1.values())[v] for key in D1.keys() and v in D2[v]}

Ответы [ 5 ]

0 голосов
/ 05 сентября 2018

Вот, пожалуйста!

D1 = {0:[1, 2, 3], 1: [0,4]}
D2 = {'Jack': 1, 'Mike': 2, 'Tim': 3, 'Paul': 4, 'Tommy': 5}

D2_inverted = {v: k for k, v in D2.iteritems()}

D3={}

for key in D1:
    temp = []
    for value in D1[key]:
        temp.append(D2_inv[value+1])
    D3[key] = temp

print D3

Итерация ключей от D1;

Создайте временный список для хранения значений, которые вы хотите присвоить новому dict, и заполните его требуемыми значениями из D2. (перевернул его ключи и значения для простоты);

Назначить на D3.

0 голосов
/ 05 сентября 2018

Не может быть лучшим решением, но работает

D3={}
for key in D1.keys():
    value_list=D1.get(key)

    value_list= [(lambda x: x+1)(x) for x in value_list]
    temp=[]
    for d2_key,value in D2.items():
        if value in value_list:
            temp.append(d2_key)
    D3[key]=temp

Выход:

{0: ['Tim', 'Mike', 'Paul'], 1: ['Jack', 'Tommy']}
0 голосов
/ 05 сентября 2018

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

from numpy import array


D1 = {0: array([1, 2, 3]), 1: array([0,4])}
D2 = {'Jack': 1, 'Mike': 2, 'Tim': 3, 'Paul': 4, 'Tommy': 5}

temp = dict(zip(D2.values(), D2.keys()))  # inverting key-value pairs

D3 = {k: [temp.get(i+1, 'N\A') for i in v] for k, v in D1.items()}

, что приводит к:

{0: ['Mike', 'Tim', 'Paul'], 1: ['Jack', 'Tommy']}
0 голосов
/ 05 сентября 2018

Если вы используете Python 3.6+, вы можете использовать enumerate, чтобы создать диктат для поиска имен в D2 по индексу, а затем сопоставить индексы в D1 с ним:

r = dict(enumerate(D2))
D3 = {k: list(map(r.get, v)) for k, v in D1.items()}

D3 станет:

{0: ['Mike', 'Tim', 'Paul'], 1: ['Jack', 'Tommy']}
0 голосов
/ 05 сентября 2018

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

D3={}
for d1k,d1v in D1.items():
    D3[d1k] = []
    for idx in d1v:
        D3[d1k].append(D2[idx])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...