у меня есть список
results = [[('Gizmo1', 1.0), 'Owner1'], [('Gizmo2', 4.0), 'Owner2'],[('Gizmo1', 4.0), 'Owner1'],[('Gizmo2', 4.0), 'Owner2']]
Моя цель состоит в том, чтобы добавить вещицы, соответствующие уважаемым владельцам.
results = [[('Gizmo1', 5.0), 'Owner1'], [('Gizmo2', 8.0), 'Owner2']]
Я попытался разбить список на два меньших списка, создать словарь
items_qty = [[('Gizmo1', 1.0)], [('Gizmo2', 4.0)],[('Gizmo1', 4.0)],[('Gizmo2', 4.0)]]
owner = [['Owner1'], ['Owner2'],['Owner1'],['Owner2']]
data = {}
for key, val in zip(owner, items_qty):
data[key] = data.get(key, 0) + val
Но это дает мне ошибку
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
Как я получаю или сохраняю информацию, не имеет значения.
попробуй это:
items_qty = [[('Gizmo1', 1.0)], [('Gizmo2', 4.0)],[('Gizmo1', 4.0)], [('Gizmo2', 4.0)]]
owner = [['Owner1'], ['Owner2'],['Owner1'],['Owner2']]
data = {}
for key, val in zip(owner, items_qty):
print(key)
giz, num = val[0]
(_, newNum) = data.get(key[0], (giz, 0))
newNum += num
data[key[0]] = (giz, newNum)
Проблема в том, что вы добавляете число к кортежу, а не к значению внутри него.
Плохо, вам пришлось добавить [0] к ключу и значению, потому что они воспринимаются как списки, уже отредактированные
Вы сохранили список списка одного кортежа в своей переменной items_qty
.
То, что вы получаете в val
, — это кортеж, а val[0]
— это "GuizmoX"
, а val[1]
— это значение, которое вы пытаетесь добавить.
Вы можете использовать временный dict
для хранения промежуточных результатов, а затем восстановить results
из него:
results = [[('Gizmo1', 1.0), 'Owner1'], [('Gizmo2', 4.0), 'Owner2'],[('Gizmo1', 4.0), 'Owner1'],[('Gizmo2', 4.0), 'Owner2']]
temp = {}
for item,owner in results:
if owner in temp:
_,value = item
prev = temp[owner]
temp[owner] = prev[0],prev[1]+value
else:
temp[owner] = item
#print(temp)
results = [[value, key] for key,value in temp.items()]
print(results)
Вывод по запросу
Попробуй это:
results = [[('Gizmo1', 1.0), 'Owner1'], [('Gizmo2', 4.0), 'Owner2'],
[('Gizmo1', 4.0), 'Owner1'],[('Gizmo2', 4.0), 'Owner2']]
data = {}
for element in results:
gizmo_value = element[0][1]
gizmo_name = element[0][0]
owner = element[1]
try:
data[owner][gizmo_name] += gizmo_value
except KeyError:
data[owner] = { gizmo_name: gizmo_value }
С помощью этой логики вы получите словарь со всеми данными, как вы его называете. Все зависит от того, как вы называете вещи.
Возвращает (giz, num) = val ValueError: недостаточно значений для распаковки (ожидалось 2, получено 1)