我已经看到了一些类似的答案,但我无法找到针对此案例的具体内容:
我有一个这样的词典列表:
[
{"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"}
]
答案 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
并添加到seen
。 seen
的添加内容为O(1)
以及查找(h not in seen
)。
最后,result
仅包含已定义h
值的唯一元素。
答案 1 :(得分:3)
您可以使用recipe中的“unique_everseen
”itertools
来创建新的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'}]