我有一个字典列表,其中一个字典值name
包含我想要规范化的重复数据。列表如下所示:
[
{'name': 'Craig McKray', 'document_id': 50, 'annotation_id': 8},
{'name': 'None on file', 'document_id': 40, 'annotation_id': 5},
{'name': 'Craig McKray', 'document_id': 50, 'annotation_id': 9},
{'name': 'Western Union', 'document_id': 61, 'annotation_id': 11}
]
我要做的是创建一个只包含唯一名称的新词典。但是我需要跟踪文档ID和注释ID。有时文档ID是相同的,但我只需要跟踪它们作为关联到一个名称。所以上面的列表会变成:
[
{'name': 'Craig McKray', 'document_ids': [50], 'annotation_ids': [8, 9]},
{'name': 'None on file', 'document_ids': [40], 'annotation_id': [5]},
{'name': 'Western Union', 'document_ids': [61], 'annotation_ids': [11]}
]
以下是我迄今为止尝试的代码:
result = []
# resolve duplicate names
result_row = defaultdict(list)
for item in data:
for double in data:
if item['name'] == double['name']:
result_row['name'] = item['name']
result_row['record_ids'].append(item['document_id'])
result_row['annotation_ids'].append(item['annotation_id'])
result.append(result_row)
代码的主要问题是我正在比较和查找重复项,但是当我迭代到下一项时,它会再次发现重复项,从而创建一个无限循环。我怎样才能编辑代码,使它不会反复比较重复的代码?你知道吗
它不完全是你想要的,但是格式应该做你想做的。你知道吗
这是输出:
在这里,我想这可能对你更好:
我对这个问题的看法:
一个更实用的
itertools.groupby
方法可能是这样的。有点神秘,我来解释。你知道吗要使用
groupby
,您需要一个排序的列表。所以先按名字排序。然后是groupby
名称。接下来您可以拉出document_id
和annotation_id
参数并压缩它们。这样做的效果是将所有document_ids
放在一个列表中,将所有annotation_id
放在另一个列表中。然后可以调用set
删除重复项,并使用生成器将每个元素生成为dict
。你知道吗我使用了一个生成器,因为它避免了建立结果列表的需要。如果你愿意的话你也可以这么做。你知道吗
相关问题 更多 >
编程相关推荐