У меня есть список диктовок, и я хотел бы удалить диктовки с одинаковым ключом и вычесть пары значений.
Для этого списка:
[{'chair': 4}, {'tv': 5}, {'chair': 3}, {'tv': 2}, {'laptop': 2}]
Я хотел бы это вернуть:
[{'chair': 1}, {'tv': 3}, {'laptop': 2}]
@BenoîtPilatte У вас не может быть дубликатов ключей в dict
Пожалуйста, отредактируйте свое сообщение и покажите нам пример Минимальный, полный и проверяемый, который у вас уже есть. Это поможет нам более внимательно подойти к вашей проблеме
Не лучше ли для начала использовать только один набор пар ключ-значение? ИМХО: наличие одноэлементных диктов не имеет смысла.
Критика структуры данных в сторону: что должно произойти, если более больше двух диктов с одинаковыми ключами?
@meowgoesthedog : ...and subtract the value pairs.
@Powertieke, если их три?






Вы можете сделать это так, создав промежуточный словарь для эффективности:
dicts_list = [{'chair': 4}, {'tv': 5}, {'chair': 3}, {'tv': 2}, {'laptop': 2}]
out = {}
for d in dicts_list:
for key, val in d.items():
if key in out:
out[key] -= val
else:
out[key] = val
out_list = [ {key:val} for key, val in out.items()]
print(out_list)
# [{'tv': 3}, {'chair': 1}, {'laptop': 2}]
Но вас может заинтересовать этот промежуточный дикт в качестве вывода:
print(out)
# {'tv': 3, 'chair': 1, 'laptop': 2}
Спасибо за вашу помощь... и как сделать то же самое с 2 словаря. например c = {'ноутбук': 2, 'стул': 4, 'телевизор': 3} и c1 = {'клавиатура': 1, 'ноутбук': 2, 'стул': 4, 'телевизор': 4, 'завод':2} и вывод должен быть d= {'клавиатура':1,'тв:1','растение:2'}
Просто установите dict_list = [c, c1].
defaultdict из коллекций может пригодиться. Это решение будет охватывать случаи, когда в списке более двух диктовок одного и того же ключа.
from collections import defaultdict
ls = defaultdict(list)
d = [{'chair': 4}, {'tv': 5}, {'chair': 3}, {'tv': 2}, {'laptop': 2}]
# Creating a list of all values under one key
for dic in d:
for k in dic:
ls[k].append(dic[k])
print(ls)
defaultdict(<class 'list'>, {'chair': [4, 3], 'tv': [5, 2], 'laptop': [2]})
# safe proofing for negative values on subtraction
for k in ls:
ls[k].sort(reverse=True)
ls[k] = ls[k][0] - sum(ls[k][1:])
print(ls)
defaultdict(<class 'list'>, {'chair': 1, 'tv': 3, 'laptop': 2})
Следующий фрагмент использует только стандартные модули:
a= [{'chair': 4}, {'tv': 5}, {'chair': 3}, {'tv': 2}, {'laptop': 2}]
print("Input:", a)
b=dict()
for element in a:
for k,v in element.items():
try:
# you didn't specify the subtracted element order,
# so I'm subtracting BIGGER from SMALLER using simple abs() :)
b[k] = abs(b[k] - v)
except:
b[k] = v
print("Output:", b)
# restore original structure
c = [ dict({item}) for item in b.items() ]
print("Output:", c)
И демо:
('Input:', [{'chair': 4}, {'tv': 5}, {'chair': 3}, {'tv': 2}, {'laptop': 2}])
('Output:', {'tv': 3, 'chair': 1, 'laptop': 2})
('Output:', [{'tv': 3}, {'chair': 1}, {'laptop': 2}])
Обновлено: добавлен вторичный вывод C для реструктуризации B, аналогично A
ОП хотел вычесть, а не добавить значения. Чем ваш ответ отличается от ответа Тьерри stackoverflow.com/a/54459576/6775799, даже после внесения этого изменения.
Да, я только что представил, а потом увидел, что использовал не тот оператор. К тому времени, когда я исправил это сейчас, Вы прокомментировали, а также кто-то другой ответил. Виноват :)
Вы можете создать defaultdict из списков, а затем использовать понимание списка:
from collections import defaultdict
dd = defaultdict(list)
for d in data:
k, v = next(iter(d.items()))
dd[k].append(v)
res = [{k: v if len(v) == 1 else v[0] - sum(v[1:])} for k, v in dd.items()]
print(res)
# [{'chair': 1}, {'tv': 3}, {'laptop': [2]}]
Что делать, если в списке более 2 диктовок с одним и тем же ключом?
Спасибо. Итак, теперь всего 4 ответа, составляя две пары на основе сходства.
@RahulChawla, да, между нами есть небольшие различия, но согласитесь, что концептуально они похожи. Разнообразие это хорошо :)
Кроме того, добавьте abs(), потому что вы не знаете, какое значение будет наибольшим среди всех диктов, что может привести к отрицательному значению. Разнообразие - это хорошо! :)
@RahulChawla, ИМО, это дополнительное предположение, которое требует уточнения в вопросе. Отрицательные числа могут быть в порядке. Эти цифры могут быть изменениями, а не количествами; мы действительно не знаем.
@RahulChawla Пожалуйста, перезагрузите страницу. Вы должны увидеть мои ответы на вопрос ОП прямо сейчас :)
Не могли бы вы показать, что вы пробовали?