在数组中查找具有重复键值的dict对象

时间:2016-01-26 23:03:48

标签: python python-3.x

我有一个包含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循环期间查找重复的条目。但是我无法找到正确的方法,所以如果有人能告诉我我做错了什么,我真的很感激。

2 个答案:

答案 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'}