преобразовать кортеж с тремя элементами в словарь - PullRequest
0 голосов
/ 01 октября 2018

Это мой кортеж

(0, 7, 4)
(1, 7, 4)
(2, 7, 4)
(3, 7, 4)
(0, 4, 1)
(0, 4, 3)
(0, 6, 4)

Я хочу преобразовать это в словарь для примера

{0:(7,4), (4, 1), (4, 3), (6, 4), 1: (7, 4), 2:(7, 4), ....}

в основном первый элемент кортежа - это ключ, а второй и третий элементыявляются ценностями.

Кортеж был сгенерирован с использованием:

for i in range(len(vertices)): 
     #print(i) 
     for j in edges: 
     d= (i, j[0], j[1]) 
     print(d) 

Ответы [ 5 ]

0 голосов
/ 01 октября 2018

Это также должно работать

l = [
    (0, 7, 4),
    (1, 7, 4),
    (2, 7, 4),
    (3, 7, 4),
    (0, 4, 1),
    (0, 4, 3),
    (0, 6, 4)]

from itertools import groupby
from operator import itemgetter
l = [(x, (y, z)) for x, y, z in l]
l.sort(key=lambda x: x[0])
d = {key: list(list(zip(*tup))[1]) for key, tup in groupby(l, itemgetter(0))}
0 голосов
/ 01 октября 2018

Я не уверен, что код, который вы разместили в этот комментарий , верен, но возможно заполнить словарь непосредственно внутри цикла

d = {}                         
for i in range(len(vertices)): 
    d[i] = []              
    for j in edges:        
        d[i].append((j[0], j[1]))                
0 голосов
/ 01 октября 2018

вместо этого

print ((i, j[0], j[1]))

вы также можете сделать

dict[i] = (j[0], j[1]) 

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

обновлении

после обзора, способ состоит в том, чтобы использовать setdefault (как уже упоминалось в другом ответе), чтобы обеспечитьчто-то отличное от другого ответа, я показываю длинный путь:

dictionary = d()
for i in range(len(vertices)): 
    for j in edges:             
        if i in d:
           d[i].append((j[0], j[1]))
        else:
           d[i] = (j[0], j[1]) 

----- Улучшено, что работает ----

dictionary = dict()
    for i in range(len(vertices)): 
        for j in edges: 
            d= (i, j[0], j[1])
            dictionary[i]=[]
            #print(d) 
            if i in dictionary :

                #print(dictionary[i])
                dictionary[i].append((j[0], j[1]),)
            else:
                dictionary[i] = (j[0], j[1])
    print(dictionary)
0 голосов
/ 01 октября 2018

попробуйте это:

from itertools import groupby


a =  [(0, 7, 4), (1, 7, 4), (2, 7, 4), (3, 7, 4), (0, 4, 1), (0, 4, 3), (0, 6, 4)]
l={} 
for i,g in groupby(a, lambda x:x[0]): 
    l[str(i)] = []  
    for v in g: 
        l[str(i)].append(v[1:])   
0 голосов
/ 01 октября 2018

Вы можете использовать следующий цикл для добавления к списку списков:

d = {}
for k, *v in l:
    d.setdefault(k, []).append(tuple(v))

, чтобы получилось:

l = [
    (0, 7, 4),
    (1, 7, 4),
    (2, 7, 4),
    (3, 7, 4),
    (0, 4, 1),
    (0, 4, 3),
    (0, 6, 4)
]

d станет:

{0: [(7, 4), (4, 1), (4, 3), (6, 4)], 1: [(7, 4)], 2: [(7, 4)], 3: [(7, 4)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...