Как мне составить список кортежей размера три в пары ключ-значение? - PullRequest
0 голосов
/ 15 сентября 2018

Цель:
1-й номер: ключ ко второму номеру
2-й номер: значение для первого номера, но ключ для третьего номера
3-й номер: значение для второго номера

def make_dictionary_list(old_list):
    return {key: values for key, *values in old_list}

Ввод:
[(4157, 1, 1), (4157, 1, 10), (4157, 2, 1), (4157, 2, 10), (4157, 3, 1), (4157, 3, 10), (4157, 4, 1), (4157, 4, 10), (4182, 1, 1)]

Выход:
{4157: [4, 10], 4182: [1, 1]}

Вывод не то, что я хочу. Как указано выше, я хотел бы, чтобы 1-й номер был ключом ко 2-му номеру, а 2-й номер был ключом к 3-му номеру. Как мне это сделать?

Спасибо!

1 Ответ

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

Вы распутываете свой список и помещаете его в словарь, используя dict.setdefault () :

data = [(4157, 1, 1), (4157, 1, 10), (4157, 2, 1), (4157, 2, 10), (4157, 3, 1), 
        (4157, 3, 10), (4157, 4, 1), (4157, 4, 10), (4182, 1, 1)]

d = {}
for k,v,p in data:
    key = d.setdefault(k,{})
    key[v]=p

print(d)

Выход:

{4157: {1: 10, 2: 10, 3: 10, 4: 10}, 4182: {1: 1}}

Вы можете получить доступ к нему:

print( d[4157][3] ) # 10

Результат короче ваших исходных данных, поскольку вы заменяете первое значение на второе:

(4157, 1, 1) => (4157, 1, 10)  # 10 replaces 1  
(4157, 2, 1) => (4157, 2, 10)  # etc.
(4157, 3, 1) => (4157, 3, 10)
(4157, 4, 1) => (4157, 4, 10) 

Вместо этого вы можете агрегировать их следующим образом:

for k,v,p in data:
    key = d.setdefault(k,{})
    key2 = key.setdefault(v,[])
    key2.append(p)

print(d)

Чтобы получить вывод:

{4157: {1: [1, 10], 2: [1, 10], 3: [1, 10], 4: [1, 10]}, 4182: {1: [1]}}

и получить к нему доступ

print( d[4157][3] ) # [1, 10]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...