2016-10-16 2 views
0

Привет, я хочу преобразовать этот список кортежей в словарь. Поскольку я новичок в python, я выясняю способы преобразования в словарь. Я мог бы преобразовать только в словарь, если есть только одно значение. В моем случае, есть два значения в it.I продемонстрируют более подробно ниже:Включить дубликаты в список кортежей в словарь, суммируя значения

`List of tuples: [('Samsung', 'Handphone',10), ('Samsung', 'Handphone',-1), 
('Samsung','Tablet',10),('Sony','Handphone',100)]` 

Как вы можете видеть выше, я хочу, чтобы определить «Samsung» в качестве ключа и «Handphone» и «10» как значения по отношению к ключу.

Мой желаемый результат будет:

`Output: {'Sony': ['Handphone',100], 'Samsung': ['Tablet',10,'Handphone', 9]}` 

Как вы можете видеть выше, пункт «handphone» и «таблетка» являются группы в соответствии с ключевыми ценностями, которые в моем случае является Sony и Samsung. Количество товара добавляется/вычитается, если оно принадлежит одному и тому же элементу и тому же ключу (Samsung или Sony).

Я бы очень признателен за любые предложения и идеи, которые вы, ребята, для достижения вышеуказанного результата. У меня действительно закончились идеи. Спасибо.

+0

'Samsung' появляется несколько тим в вашем списке. Словарь может иметь только один экземпляр ключа. Что должно произойти для нескольких записей с одним и тем же ключом? –

+0

Я бы предложил словарь словарей вместо запрошенного (недействительного) формата вывода. Результат в таком формате: {'Sony': {'Handphone': 100}, 'Samsung': {'Handphone': 9, 'Tablet': 10}} – Wehrdo

+0

Привет @ John1024, простите меня. Могу ли я спросить, почему мой желаемый результат не является допустимым словарем? – user3271404

ответ

3

Хорошая возможность для defaultdict

from collections import defaultdict 

the_list = [ 
    ('Samsung', 'Handphone', 10), 
    ('Samsung', 'Handphone', -1), 
    ('Samsung', 'Tablet', 10), 
    ('Sony', 'Handphone', 100) 
] 

d = defaultdict(lambda: defaultdict(int)) 

for brand, thing, quantity in the_list: 
    d[brand][thing] += quantity 

Результат будет

{ 
    'Samsung': { 
     'Handphone': 9, 
     'Tablet': 10 
    }, 
    'Sony': { 
     'Handphone': 100 
    } 
} 
+0

Привет @Josha Inglis, как произвести результат выше? Я попытался, но не смог. Простите. Спасибо. – user3271404

+0

Здравствуйте, @ user3271404, вы должны иметь возможность скопировать/вставить ответ выше, затем 'print (d)', чтобы увидеть словарь. –

+0

Для доступа к '' Samsung''' 'Handphone'' вы можете использовать 'd [' Samsung '] [' Handphone ']' –

0

Вы можете сделать это с помощью словаря понимания

То, что вы действительно хотите являются кортежи для ключей, которые будут компании и устройство.

tuples = [('Samsung', 'Handphone',10), 
      ('Samsung', 'Handphone',-1), 
      ('Samsung','Tablet',10), 
      ('Sony','Handphone',100)] 

d = {} 
for company, device, n in tuples: 
    key = (company, device) 
    d[key] = d.get(key, 0) + n 
+0

Это не добавляет совпадающие элементы «Samsung Handphone». Каждый новый элемент Samsung просто перезапишет предыдущий. – Wehrdo

+0

@Wehrdo Ах, это было не совсем ясно из вопроса, что было то, что они хотели. –

+0

Привет @Wehrdo, извините за двусмысленность в вопросе. Я стараюсь как можно яснее. Что вы предлагаете сделать мой вопрос более ясным? Спасибо! – user3271404

0

Ваш выход имеет проблемы, которые можно увидеть при правильном identation:

{ 
    'Sony': ['Handphone',100], 
    'Samsung': ['Tablet',10], 
    ['Handphone', 9] 
} 

рук телефон не является частью «Samsung», вы можете сделать список списков, чтобы получить:

{ 
    'Sony': [ 
     ['Handphone',100] 
    ], 
    'Samsung': [ 
     ['Tablet',10], 
     ['Handphone', 9] 
    ] 
} 

С:

my_list = [('Samsung', 'Handphone',10), ('Samsung', 'Handphone',-1), ('Samsung','Tablet',10),('Sony','Handphone',100)] 

result = {} 
for brand, device, value in my_list: 
    # first verify if key is present to add list for the first time 
    if not brand in result: 
     result[brand] = [] 
    # then add new list to already existent list 
    result[brand] += [[device, value]] 

Но я думаю, что лучший формат будет ДИКТ:

{ 
    'Sony': { 
     'Handphone': 100 
    }, 
    'Samsung': { 
     'Tablet': 10, 
     'Handphone': 9 
    } 
} 

Это было бы как:

my_list = [('Samsung', 'Handphone',10), ('Samsung', 'Handphone',-1), ('Samsung','Tablet',10),('Sony','Handphone',100)] 

result = {} 
for brand, device, value in my_list: 
    # first verify if key is present to add dict for the first time 
    if not brand in result: 
     result[brand] = {} 
    # then add new key/value to already existent dict 
    result[brand][device] = value 
+0

Привет @Seiji Hirao, как создать результат? Я не мог понять. Простите. Спасибо. – user3271404

+0

Извините, у моего python есть некоторые проблемы только сейчас. Я мог бы распечатать результат уже. Спасибо за ваше четкое и краткое объяснение. Я понял, как это работает. Brilliant! Спасибо огромное! – user3271404

+0

Я рад, что это помогло;) –

Смежные вопросы