我是 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)
任何帮助,将不胜感激
谢谢
您的字典整体上并不重复,您仅通过 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)
| 归档时间: |
|
| 查看次数: |
4509 次 |
| 最近记录: |