Python 如何根据DICT中某个值的百分比相似性来唯一化DICT列表
我有一个目录列表,它的属性可能与列表中的其他目录重复或类似。我想使用相似性比较函数来统一这个列表。如果任何一个DICT的键“问候语”的值彼此相差一定百分比,则只应保留一个 例如,在此列表中,我只想保留一个“hello world”:Python 如何根据DICT中某个值的百分比相似性来唯一化DICT列表,python,list,dictionary,unique,similarity,Python,List,Dictionary,Unique,Similarity,我有一个目录列表,它的属性可能与列表中的其他目录重复或类似。我想使用相似性比较函数来统一这个列表。如果任何一个DICT的键“问候语”的值彼此相差一定百分比,则只应保留一个 例如,在此列表中,我只想保留一个“hello world”: list = [{"greeting":"HELLO WORLD!", ...}, {"greeting":"Hello Mars", ...}, {"greeting":"Hello World!!!", ...}, {"greeting":"hello worl
list = [{"greeting":"HELLO WORLD!", ...}, {"greeting":"Hello Mars", ...}, {"greeting":"Hello World!!!", ...}, {"greeting":"hello world", ...}]
在不确定之后,结果将是:
list = [{"greeting":"HELLO WORLD!", ...}, {"greeting":"Hello Mars", ...}
所有其他带有类似问候语的口述都应从列表中删除。
保留哪一条类似的口述并不重要
以下是一个函数:
使用确定唯一性的函数,可以执行以下操作:
import difflib
def similar(seq1, seq2):
return difflib.SequenceMatcher(a=seq1.lower(), b=seq2.lower()).ratio() > 0.9
def unique(mylist, keys):
temp = mylist[:]
for d in mylist:
temp.pop(0)
[d2.pop(i) for i in keys if d.has_key(i)
for d2 in temp if d2.has_key(i) and similar(d[i], d2[i])]
return mylist
请注意,这将就地修改词典:
mylist = [{"greeting":"HELLO WORLD!"}, {"greeting":"Hello Mars"}, {"greeting":"Hello World!!!"}, {"greeting":"hello world"}]
unique(mylist, ['greeting'])
print mylist
输出:
[{'greeting': 'HELLO WORLD!'}, {'greeting': 'Hello Mars'}, {}, {}]
是否所有字典都包含相同的键?是的,但只有问候键的值才是用于uniquify的值。您希望生成的结构是什么样的?您所有的
dict
s都有一个条目。这是典型的吗?@robert dicts会有其他条目,这个例子过于简单化了。但是所有的dict都有相同数量的条目和相同的键。结构应该保持不变,只是删除了重复的条目。这会起作用,但DICT将有其他不应检查的条目,只应检查“问候语”的值。在这个例子中,为了简单起见,我在每个dict中只放了一个条目。@Chad:那么?只需比较问候语
值即可。我编辑它是为了传递您要检查的键,而且您可能希望摆脱列表理解,而将其作为for
循环来执行,以保持清晰。@Amr,谢谢,这非常有效。如果有重复的问候语值,有什么方法可以删除整个dict?删除是指从列表中删除词典,还是将词典变为空?
[{'greeting': 'HELLO WORLD!'}, {'greeting': 'Hello Mars'}, {}, {}]