当只有一个键值不同时,从字典列表中删除重复项

时间:2013-03-19 22:41:02

标签: python

我已经看到了一些类似的答案,但我无法找到针对此案例的具体内容:

我有一个这样的词典列表:

[
 {"element":Bla, "version":2, "date":"12/04/12"},
 {"element":Bla, "version":2, "date":"12/05/12"},
 {"element":Bla, "version":3, "date":"12/04/12"}
]

实际字典有许多其他键,但我要做的是删除所有具有完全相同的键对值的条目,日期除外。也就是说,删除所有重复项(由于日期不同而不是真正完全重复)。在这种情况下,我期望得到的是:

[
 {"element":Bla, "version":2, "date":"12/04/12"},
 {"element":Bla, "version":3, "date":"12/04/12"}
]

5 个答案:

答案 0 :(得分:6)

你说你在字典中没有提到很多其他的问题。

这是O(n)算法,可以满足您的需求:

>>> seen = set()
>>> result = []
>>> for d in dicts:
...     h = d.copy()
...     h.pop('date')
...     h = tuple(h.items())
...     if h not in seen:
...         result.append(d)
...         seen.add(h)

>>> pprint(result)
[{'date': '12/04/12', 'element': 'Bla', 'version': 2},
 {'date': '12/04/12', 'element': 'Bla', 'version': 3}]

h是dict的副本。 date已删除pop密钥。

然后tuple被创建为可清除类型,可以添加到set

如果以前从未见过h,我们会将其附加到result并添加到seenseen的添加内容为O(1)以及查找(h not in seen)。

最后,result仅包含已定义h值的唯一元素。

答案 1 :(得分:3)

您可以使用recipe中的“unique_everseenitertools来创建新的list

list(unique_everseen(original_list, key=lambda e: '{element}@{version}'.format(**e)))

如果你的“密钥”需要比我写的lambda宽(以容纳更多的值),那么它可能值得提取到一个函数:

def key_without_date(element):
    return '@'.join(["{}".format(v) for k,v in element.iteritems() if k != 'date'])

list(unique_everseen(original_list, key=key_without_date))

答案 2 :(得分:1)

熊猫可以迅速解决这个问题:

import pandas as pd
Bla = "Bla"
d = [
{"element":Bla, "version":2, "date":"12/04/12"},
{"element":Bla, "version":2, "date":"12/05/12"},
{"element":Bla, "version":3, "date":"12/04/12"}
]
df = pd.DataFrame(d)
df[~df.drop("date", axis=1).duplicated()]

输出:

       date element  version
0  12/04/12     Bla        2
2  12/04/12     Bla        3

答案 3 :(得分:0)

为可怕的变量名称道歉。可能有一种更清洁的方式,但这应该有效

seen = {(item["element"], item["version"]): False for item in mylist}

output = []
for item in mylist:
    item_key = (item["element"], item["version"])
    if not seen[item_key]:
        output.append(item)
        seen[item_key] = True

答案 4 :(得分:0)

这有效:

LoD=[
{"element":'Bla', "version":2, 'list':[1,2,3], "date":"12/04/12"},
{"element":'Bla', "version":2, 'list':[1,2,3], "date":"12/05/12"},
{"element":'Bla', "version":3, 'list':[1,2,3], "date":"12/04/12"}
]

LoDcopy=[]
seen=set()


for d in LoD:
    dc=d.copy()
    del dc['date']
    s=dc.__str__()
    if s in seen: continue
    seen.add(s)
    LoDcopy.append(d)    

print LoDcopy 

打印:

[{'date': '12/04/12', 'version': 2, 'list': [1, 2, 3], 'element': 'Bla'}, 
 {'date': '12/04/12', 'version': 3, 'list': [1, 2, 3], 'element': 'Bla'}]