Удалить повторяющиеся словари из списка и вычесть значение ключей повторяющегося элемента

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

Для этого списка:

[{'chair': 4}, {'tv': 5}, {'chair': 3}, {'tv': 2}, {'laptop': 2}]

Я хотел бы это вернуть:

[{'chair': 1}, {'tv': 3}, {'laptop': 2}]

Не могли бы вы показать, что вы пробовали?

Anurag A S 31.01.2019 12:18

@BenoîtPilatte У вас не может быть дубликатов ключей в dict

Thierry Lathuille 31.01.2019 12:20

Пожалуйста, отредактируйте свое сообщение и покажите нам пример Минимальный, полный и проверяемый, который у вас уже есть. Это поможет нам более внимательно подойти к вашей проблеме

Phx Dev 31.01.2019 12:22

Не лучше ли для начала использовать только один набор пар ключ-значение? ИМХО: наличие одноэлементных диктов не имеет смысла.

Harly H. 31.01.2019 12:24

Критика структуры данных в сторону: что должно произойти, если более больше двух диктов с одинаковыми ключами?

meowgoesthedog 31.01.2019 12:24

@meowgoesthedog : ...and subtract the value pairs.

Powertieke 31.01.2019 12:25

@Powertieke, если их три?

meowgoesthedog 31.01.2019 12:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
147
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете сделать это так, создав промежуточный словарь для эффективности:

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'}

Grv 01.02.2019 05:23

Просто установите dict_list = [c, c1].

Rahul Chawla 01.02.2019 07:43

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, даже после внесения этого изменения.

Rahul Chawla 31.01.2019 12:47

Да, я только что представил, а потом увидел, что использовал не тот оператор. К тому времени, когда я исправил это сейчас, Вы прокомментировали, а также кто-то другой ответил. Виноват :)

Harly H. 31.01.2019 12:51

Вы можете создать 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 диктовок с одним и тем же ключом?

Rahul Chawla 31.01.2019 12:50

Спасибо. Итак, теперь всего 4 ответа, составляя две пары на основе сходства.

Rahul Chawla 31.01.2019 12:54

@RahulChawla, да, между нами есть небольшие различия, но согласитесь, что концептуально они похожи. Разнообразие это хорошо :)

jpp 31.01.2019 12:54

Кроме того, добавьте abs(), потому что вы не знаете, какое значение будет наибольшим среди всех диктов, что может привести к отрицательному значению. Разнообразие - это хорошо! :)

Rahul Chawla 31.01.2019 12:55

@RahulChawla, ИМО, это дополнительное предположение, которое требует уточнения в вопросе. Отрицательные числа могут быть в порядке. Эти цифры могут быть изменениями, а не количествами; мы действительно не знаем.

jpp 31.01.2019 12:57

@RahulChawla Пожалуйста, перезагрузите страницу. Вы должны увидеть мои ответы на вопрос ОП прямо сейчас :)

Harly H. 31.01.2019 13:00

Другие вопросы по теме