I have a list "records" like this
data = [
{'id':1, 'name': 'A', 'price': 10, 'url': 'foo'},
{'id':2, 'name': 'A', 'price': 20, 'url': 'bar'},
{'id':3, 'name': 'A', 'price': 30, 'url': 'baz'},
{'id':4, 'name': 'A', 'price': 10, 'url': 'baz'},
{'id':5, 'name': 'A', 'price': 20, 'url': 'bar'},
{'id':6, 'name': 'A', 'price': 30, 'url': 'foo'},
{'id':7, 'name': 'A', 'price': 99, 'url': 'quu'},
{'id':8, 'name': 'B', 'price': 10, 'url': 'foo'},
]
我希望能够删除“重复”的记录,其中相等性由一系列逻辑条件定义。列表中的每个元素都是一个OR条件,并且所有元素都与AND连接在一起。例如:
filters = [ ['name'], ['price', 'url'] ]
如果两个记录的名称和(价格或URL)相等,则认为它们相等。对于上面的示例:
For item 1 the duplicates are 4 (by name and price) and 6 (name+url)
For item 2 - 5 (name+price, name+url)
For item 3 - 4 (name+url) and 6 (name+price)
For item 7 there are no duplicates (neither price nor url match)
For item 8 there are no duplicates (name doesn't match)
因此,结果列表必须包含项目1、2、3、7和8。
请注意:
- 可能会有更多的AND条件:['name'],['price','url'],['weight'],['size'],... - 条件列表中的OR组可能比2个项目更长,例如['name'],['price','url','weight']... - 源列表非常长,O(n^2)算法是不可行的。
sqlite3
的东西来代替一个字典。 - abarnert