Как получить повторяющиеся значения из списка словаря в python

Я новичок в python, и я пытаюсь отделить повторяющиеся ключи от моего списка словаря. Найдите список ниже

dataList = [{'Key': 'US', 'Val': 'NewYork'},
 {'Key': 'Aus', 'Val': 'Sydney'}, 
 {'Key': 'US', 'Val': 'Washington'}, 
 {'Key': 'Ind', 'Val': 'Delhi'}, 
 {'Key': 'Fra', 'Val': 'Paris'},
 {'Key': 'Ind', 'Val': 'Chennai'}]

Я хотел бы получить повторяющиеся ключи и их значения

ожидаемый результат

duplicates = [{'Key': 'Ind', 'Val': 'Delhi'},{'Key': 'Ind', 'Val': 'Chennai'},{'Key': 'US', 'Val': 'NewYork'},{'Key': 'US', 'Val': 'Washington'}]
nonduplicate = [{'Key': 'Aus', 'Val': 'Sydney'},{'Key': 'Fra', 'Val': 'Paris'}]

Найдите ниже мой пример кода, он не дает мне желаемого результата

uniqueValues = []
duplicateValues = []
# Creating a list of all duplicate values in dictionary
for attribute in dataList:
    for k, v in attribute.items():
        if v not in uniqueValues :
            uniqueValues.append(v)
        else:    
            duplicateValues.append(v)

Любая помощь будет оценена

Спасибо

Это потому, что словари все не дублируются. Есть только значения Key.

Martijn Pieters 15.03.2019 12:33
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
2 224
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ваши словари не являются дубликатами в целом, вы определяете их как уникальные только по значению Key, поэтому v not in uniqueValues не найдет {'Key': 'US', 'Val': 'NewYork'} при тестировании с {'Key': 'US', 'Val': 'Washington'}.

Обратите внимание, что даже если бы v not in uniqueValues был правильным тестом, вы бы уже добавили {'Key': 'US', 'Val': 'NewYork'} к uniqueValues, и вам пришлось бы снова удалить его и переместить в duplicateValues в тот момент, когда вы найдете доказательство того, что это дубликат.

Вместо этого, чтобы разделить словари на две части, вам нужно подсчитать значения 'Key'первый, чтобы вы знали, существует ли только одно из заданных значений или больше:

from collections import Counter

key_counts = Counter(d['Key'] for d in dataList)

uniqueValues = []
duplicateValues = []
for d in dataList:
    if key_counts[d['Key']] == 1:
        uniqueValues.append(d)
    else:
        duplicateValues.append(d)

Не поддавайтесь искушению пропустить цикл подсчета, в то время как вы могу подсчитываете d['Key'] значения в цикле for d in dataList:, вы повторяете этот подсчет для повторяющихся ключей несколько раз, а также вам придется перебирать все dataList для каждого элемента в dataList , давая вашему коду объем работы квадратичный, или O(N^2) в Обозначение большого O. При подсчете первый объем работы растет только линейно, или O(N).

Демо:

>>> from collections import Counter
>>> from pprint import pprint
>>> dataList = [{'Key': 'US', 'Val': 'NewYork'},
...  {'Key': 'Aus', 'Val': 'Sydney'},
...  {'Key': 'US', 'Val': 'Washington'},
...  {'Key': 'Ind', 'Val': 'Delhi'},
...  {'Key': 'Fra', 'Val': 'Paris'},
...  {'Key': 'Ind', 'Val': 'Chennai'}]
>>> key_counts = Counter(d['Key'] for d in dataList)
>>> key_counts
Counter({'US': 2, 'Ind': 2, 'Aus': 1, 'Fra': 1})
>>> uniqueValues = []
>>> duplicateValues = []
>>> for d in dataList:
...     if key_counts[d['Key']] == 1:
...         uniqueValues.append(d)
...     else:
...         duplicateValues.append(d)
...
>>> pprint(uniqueValues)
[{'Key': 'Aus', 'Val': 'Sydney'}, {'Key': 'Fra', 'Val': 'Paris'}]
>>> pprint(duplicateValues)
[{'Key': 'US', 'Val': 'NewYork'},
 {'Key': 'US', 'Val': 'Washington'},
 {'Key': 'Ind', 'Val': 'Delhi'},
 {'Key': 'Ind', 'Val': 'Chennai'}]

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