Python:删除json中2键值的重复项

mw3dktmi  于 2023-03-04  发布在  Python
关注(0)|答案(3)|浏览(130)

我有一个json文件组织像下面一个,我想删除所有重复的2键对元素

[{'name': 'anna', 'city': 'paris','code': '5'},  
{'name': 'anna', 'city': 'paris','code': '2'},
{'name': 'henry', 'city': 'london','code': '1'},
{'name': 'henry', 'city': 'london','code': '3'},...]

预期产出

[{'name': 'anna', 'city': 'paris'},{'name': 'henry', 'city': 'london'}]

我正在为这个任务而奋斗,你有什么想法吗?

8xiog9wr

8xiog9wr1#

你需要为(名字,城市)和具有相同对的记录创建唯一的键,只需要应用在最终结果中保留什么的条件。
一旦完成,得到值,这就是答案。
使用walrus运算符和dict-comprehension

>>> l = [{'name': 'anna', 'city': 'paris', 'code': '5'}, {'name': 'anna', 'city': 'paris', 'code': '2'}, {'name': 'henry', 'city': 'london', 'code': '1'}, {'name': 'henry', 'city': 'london', 'code': '3'}]
>>> result = { (name:= subdict['name'], city:= subdict['city']): dict(name=name, city=city) for subdict in l}
>>> result
{('anna', 'paris'): {'name': 'anna', 'city': 'paris'}, ('henry', 'london'): {'name': 'henry', 'city': 'london'}}
>>> solution = list(result.values())
>>> solution
[{'name': 'anna', 'city': 'paris'}, {'name': 'henry', 'city': 'london'}]
rmbxnbpk

rmbxnbpk2#

在pure python中,您可以在字典行中选择所需的内容,使用tuple(带{})之类的可散列行集合,然后使用所选内容重建行

items = [
    {'name': 'anna', 'city': 'paris','code': '5'},
    {'name': 'anna', 'city': 'paris','code': '2'},
    {'name': 'henry', 'city': 'london','code': '1'},
    {'name': 'henry', 'city': 'london','code': '3'}
]

unique = {(item["name"], item["city"]) for item in items}

unique = [{"name": item[0], "city": item[1]} for item in unique]
x8diyxa7

x8diyxa73#

下面是另一种使用 * set * 的方法(许多方法中的一种),如下所示:

input_list = [
    {'name': 'anna', 'city': 'paris', 'code': '5'},
    {'name': 'anna', 'city': 'paris', 'code': '2'},
    {'name': 'henry', 'city': 'london', 'code': '1'},
    {'name': 'henry', 'city': 'london', 'code': '3'}
]

output_list = []
unique_names = set()

for d in input_list:
    if (name := d.get('name')) not in unique_names:
        output_list.append({k: v for k, v in d.items() if k != 'code'})
        unique_names.add(name)

print(output_list)
    • 输出:**
[{'name': 'anna', 'city': 'paris'}, {'name': 'henry', 'city': 'london'}]
    • 注:**

这样做至少有一个好处。其他的答案是构建新的字典来包含键'name'和'city',并隐式忽略'code',这对于所示的数据来说是很好的。然而,这种方法构建的新字典不包括'code'。这意味着字典结构(输入数据)可以在不必改变功能代码的情况下改变,即,"代码"键可以不存在,并且可以引入除了"名称"和"城市"之外的键/值对

相关问题