我有一个字典列表,我想删除字典具有相同的键和值对。
这个列表:[{a: 123}, {b: 123}, {a: 123}]
我想返回这个:[{'a': 123}, {'b': 123}]
另一个例子:
这个列表:[{' a ': 123, ' b ': 1234}, {' a ': 3222, ' b ': 1234}, {' a ': 123, ' b ': 1234}]
我想退回这:[{' a ': 123, ' b ': 1234}, {' a ': 3222, ' b ': 1234}]
如果您在工作流中使用Pandas,一种选择是直接向pd提供字典列表。DataFrame构造函数。然后使用drop_duplicate和to_dict方法获得所需的结果。
import pandas as pd
d = [{'a': 123, 'b': 1234}, {'a': 3222, 'b': 1234}, {'a': 123, 'b': 1234}]
d_unique = pd.DataFrame(d).drop_duplicates().to_dict('records')
print(d_unique)
[{'a': 123, 'b': 1234}, {'a': 3222, 'b': 1234}]
试试这个:
[dict(t) for t in {tuple(d.items()) for d in l}]
策略是将字典列表转换为元组列表,其中元组包含字典的项。由于元组可以散列,您可以使用set(此处使用set理解,旧的python替代方法是set(tuple(d.s items()) for d in l))删除重复项,然后使用dict从元组重新创建字典。
地点:
L是原始列表
D是列表中的一个字典
T是从字典中创建的元组之一
编辑:如果你想保持顺序,上面的一行代码将不起作用,因为set不会这样做。然而,用几行代码,你也可以做到这一点:
l = [{'a': 123, 'b': 1234},
{'a': 3222, 'b': 1234},
{'a': 123, 'b': 1234}]
seen = set()
new_l = []
for d in l:
t = tuple(d.items())
if t not in seen:
seen.add(t)
new_l.append(d)
print new_l
示例输出:
[{'a': 123, 'b': 1234}, {'a': 3222, 'b': 1234}]
注意:正如@alexis指出的那样,两个具有相同键和值的字典可能不会产生相同的元组。如果他们经历了不同的添加/删除键历史记录,就可能发生这种情况。如果这是您的问题,那么考虑按照他的建议对d.s items()进行排序。
有很多搜索重复值和键的好例子,下面是我们在列表中过滤整个字典重复数据的方法。如果您的源数据是由EXACT格式的字典组成并寻找重复项,请使用dupKeys =[]。否则设置dupKeys =为您希望没有重复条目的数据的键名,可以是1到n个键。它不优雅,但工作和非常灵活
import binascii
collected_sensor_data = [{"sensor_id":"nw-180","data":"XXXXXXX"},
{"sensor_id":"nw-163","data":"ZYZYZYY"},
{"sensor_id":"nw-180","data":"XXXXXXX"},
{"sensor_id":"nw-97", "data":"QQQQQZZ"}]
dupKeys = ["sensor_id", "data"]
def RemoveDuplicateDictData(collected_sensor_data, dupKeys):
checkCRCs = []
final_sensor_data = []
if dupKeys == []:
for sensor_read in collected_sensor_data:
ck1 = binascii.crc32(str(sensor_read).encode('utf8'))
if not ck1 in checkCRCs:
final_sensor_data.append(sensor_read)
checkCRCs.append(ck1)
else:
for sensor_read in collected_sensor_data:
tmp = ""
for k in dupKeys:
tmp += str(sensor_read[k])
ck1 = binascii.crc32(tmp.encode('utf8'))
if not ck1 in checkCRCs:
final_sensor_data.append(sensor_read)
checkCRCs.append(ck1)
return final_sensor_data
final_sensor_data = [{"sensor_id":"nw-180","data":"XXXXXXX"},
{"sensor_id":"nw-163","data":"ZYZYZYY"},
{"sensor_id":"nw-97", "data":"QQQQQZZ"}]