Изменение формата словаря - PullRequest
0 голосов
/ 19 июня 2020

Я хочу изменить словарь ниже ...

dict = {
    'A': [('B', 1), ('C', 3), ('D', 7)],
    'B': [('D', 5)],
    'C': [('D', 12)] }

в другой форме, например:

dict = [
('A', 'B', 1), ('A', 'C', 3), ('A', 'D', 7),
('B', 'D', 5), ('C', 'D', 12)]

Это то, что я сделал.

dict = {
 'A': [('B', 1), ('C', 3), ('D', 7)],
 'B': [('D', 5)],
 'C': [('D', 12)] }

if(i[0] in dict):
    value = dict[i[0]]
    newvalue = i[1],i[2]
    value.append(newvalue)
    dict1[i[0]]=value

else:
    newvalue = i[1],i[2]
    l=[]
    l.append(newvalue)
    dict[i[0]]=l   

print (dict)

Спасибо

Ответы [ 4 ]

1 голос
/ 19 июня 2020

Python кортеж - неизменяемый объект. Следовательно, любая операция, которая пытается его изменить (например, добавление), не разрешена. Однако можно использовать следующий обходной путь.

dict = {
    'A': [('B', 1), ('C', 3), ('D', 7)],
    'B': [('D', 5)],
    'C': [('D', 12)] }

new_dict = []

for key, tuple_list in dict.items():
    for tuple_item in tuple_list:
        entry = list(tuple_item)
        entry.append(key)
        new_dict.append(tuple(entry))

print(new_dict)

Вывод: [('B', 1, 'A'), ('C', 3, 'A'), ('D', 7, 'A'), ('D', 5, 'B'), ('D', 12, 'C')]

0 голосов
/ 19 июня 2020

С пониманием списка;

dict_ = {
    'A': [('B', 1), ('C', 3), ('D', 7)],
    'B': [('D', 5)],
    'C': [('D', 12)] }

result = [(key, value[0], value[1]) for key, list_ in dict_.items() for value in list_]

Вывод;

[('A', 'B', 1), ('A', 'C', 3), ('A', 'D', 7), ('B', 'D', 5), ('C', 'D', 12)]
0 голосов
/ 19 июня 2020

Простой подход может быть

new_dict = []
for letter1, list in dict.items():
    for letter2, value in list:
        new_dict.append([letter1, letter2, value])
0 голосов
/ 19 июня 2020

Вы можете перебирать словарь, используя .items(). Обратите внимание, что каждое значение само по себе является списком кортежей. Мы хотим распаковать каждый кортеж, поэтому нам нужен вложенный for-l oop, как показано ниже. res - это список вывода, который мы будем заполнять в l oop.

res = []
for key, values in dict.items():
    for value in values:
        res.append((key, value[0], value[1]))

Пример вывода:

>>> res
[('A', 'B', 1), ('A', 'C', 3), ('A', 'D', 7), ('B', 'D', 5), ('C', 'D', 12)]

EDIT : если value - это кортеж из более чем двух элементов, мы бы изменили последнюю строку следующим образом, используя распаковку кортежа :

res.append((key, *value))

Это эффективно распаковывает все элементы value. Например,

>>> test = (1, 2, 3)
>>> (0, *test)
(0, 1, 2, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...