我有一个包含dict对象的列表,一个dict代表我的MySQL数据库中的一条记录。所以我想找到每个字典,其中title
键的值是重复的,然后更新重复的项目。
所以我有这样的事情:
dict1 = {"id":1234,"title":"apple"}
dict2 = {"id":1235,"title":"orange"}
dict3 = {"id":1236,"title":"apple"}
dict4 = {"id":1237,"title":"kiwi"}
results = [dict1,dict2,dict3,dict4]
我想结束这样的事情:
dict1 = {"id":1234,"title":"apple"}
dict2 = {"id":1235,"title":"orange"}
dict3 = {"id":1236,"title":"apple 2"}
dict4 = {"id":1237,"title":"kiwi"}
这是我的尝试,这不起作用。当我运行它时,if语句永远不会成立。 (注意:我正在使用peewee,我从数据库中获取基本数组,因此我可以访问像obj.title
这样的值,但我认为这些对象可以作为一个简单的字典)
objects = mydb.select().where(mydb.title.contains("usa"))
objectsB = objects
for obj in objects:
for obj2 in objectsB:
if obj.title is obj2.title and obj.objectId is not obj2.objectId:
obj2.title = "%s Duplicate" % (obj.title,)
print(obj2.title)
正如您所看到的,我有另一个密钥objectId
,它总是不同的,因此它可用于在for循环期间查找重复的条目。但是我无法找到正确的方法,所以如果有人能告诉我我做错了什么,我真的很感激。
答案 0 :(得分:2)
为什么不使用Peewee ORM + SQL为您完成工作?
query = (Fruit
.select(Fruit.title, fn.COUNT(Fruit.id))
.group_by(Fruit.title)
.having(fn.COUNT(Fruid.id) > 1))
然后你会有一个列表,其中只包含多个具有相同标题的水果。
答案 1 :(得分:1)
我使用Counter
,因此您只需迭代结果集一次:
from collections import Counter
results = [
{"id":1234,"title":"apple"},
{"id":1235,"title":"orange"},
{"id":1236,"title":"apple"},
{"id":1237,"title":"kiwi"},
]
title_counter = Counter()
for result in results:
title = result["title"]
title_counter[title] += 1
if title_counter[title] > 1:
result["title"] += " " + str(title_counter[title])
for result in results:
print(result)
打印哪些:
{'id': 1234, 'title': 'apple'}
{'id': 1235, 'title': 'orange'}
{'id': 1236, 'title': 'apple 2'}
{'id': 1237, 'title': 'kiwi'}