Преобразовать кортеж из трех элементов в словарь

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

(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) 

Это список кортежей или что именно вы вводите?

schwobaseggl 01.10.2018 16:56

Нет, это не список кортежей. Он создается с помощью цикла for. для i в диапазоне (len (вершины)): #print (i) для j в ребрах: d = (i, j [0], j [1]) print (d)

lpt 01.10.2018 16:57

@lpt код в этот комментарий относится к вопросу. Не могли бы вы задать свой вопрос редактировать, включая код? Более того, я сомневаюсь, что опубликованный вами код может дать представленные вами данные. В конце концов, примите во внимание, что вы можете создать запрошенный словарь прямо внутри цикла (если он был правильным, как опубликовано).

gboffi 01.10.2018 17:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
90
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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)]

как бы вы преобразовали эти списки, например [7, 4], [4, 1] в кортежи.

lpt 01.10.2018 17:00

Я обновил свой ответ, чтобы вместо этого он преобразовывал их в кортежи.

blhsing 01.10.2018 17:01

ну, в моем случае это не список, я сгенерировал его с помощью цикла for. Цепочка itertools не помещает это в один список.

lpt 01.10.2018 17:06
l может быть любым итеративным, а не только списком. Или вы можете легко использовать конструктор list() для преобразования итерации в список.
blhsing 01.10.2018 17:07

Или, если вы хотите применить это к существующему циклу for, где у вас уже есть кортеж t, сгенерированный на каждой итерации, вы можете выполнить k, *v = t перед тем, как выполнять d.setdefault(k, []).append(tuple(v)).

blhsing 01.10.2018 17:28
Ответ принят как подходящий

вместо этого

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)

он генерирует кортеж, к которому нельзя добавить сообщение, здесь dictionary [i] .append ((j [0], j [1])). Пытаюсь найти решение здесь. Я думаю, что это сработает после этого решения

lpt 01.10.2018 17:37

но если я закомментирую добавляемую часть, он генерирует словарь по условию «else».

lpt 01.10.2018 17:40

хорошо, вы также можете использовать collections.defaultdict, пытался избежать этого, но вы могли бы попробовать

Yuca 01.10.2018 17:47

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

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:])   

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

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

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

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))}

Другие вопросы по теме