Я новичок в 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, поэтому 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'}]
Это потому, что словари все не дублируются. Есть только значения
Key.