如何从Python中的字典列表中获取重复值

Dev*_*Dev 1 python python-3.x

我是 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'}]
Run Code Online (Sandbox Code Playgroud)

我想获取重复的键及其值

预期结果

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'}]
Run Code Online (Sandbox Code Playgroud)

在下面找到我的示例代码,它没有给我想要的输出

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)
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激

谢谢

Mar*_*ers 5

您的字典整体上并不重复,您仅通过 value 将它们定义为唯一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)
Run Code Online (Sandbox Code Playgroud)

不要试图跳过计数循环,虽然您也可以d['Key']对循环中的值进行计数for d in dataList:,但您会多次重复对重复键进行计数,并且您必须循环遍历dataList中的每个项目dataList,给出您的代码要做的工作量的二次方,或用Big O 表示法表示的 O(N^2) 。通过计数,工作量只会线性增长,即 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'}]
Run Code Online (Sandbox Code Playgroud)