Это мой кортеж
(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)
Нет, это не список кортежей. Он создается с помощью цикла for. для i в диапазоне (len (вершины)): #print (i) для j в ребрах: d = (i, j [0], j [1]) print (d)
@lpt код в этот комментарий относится к вопросу. Не могли бы вы задать свой вопрос редактировать, включая код? Более того, я сомневаюсь, что опубликованный вами код может дать представленные вами данные. В конце концов, примите во внимание, что вы можете создать запрошенный словарь прямо внутри цикла (если он был правильным, как опубликовано).






Вы можете использовать следующий цикл для добавления в список списков:
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] в кортежи.
Я обновил свой ответ, чтобы вместо этого он преобразовывал их в кортежи.
ну, в моем случае это не список, я сгенерировал его с помощью цикла for. Цепочка itertools не помещает это в один список.
l может быть любым итеративным, а не только списком. Или вы можете легко использовать конструктор list() для преобразования итерации в список.
Или, если вы хотите применить это к существующему циклу for, где у вас уже есть кортеж t, сгенерированный на каждой итерации, вы можете выполнить k, *v = t перед тем, как выполнять d.setdefault(k, []).append(tuple(v)).
вместо этого
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])). Пытаюсь найти решение здесь. Я думаю, что это сработает после этого решения
но если я закомментирую добавляемую часть, он генерирует словарь по условию «else».
хорошо, вы также можете использовать collections.defaultdict, пытался избежать этого, но вы могли бы попробовать
попробуй это:
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))}
Это список кортежей или что именно вы вводите?