Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据DICT中某个值的百分比相似性来唯一化DICT列表_Python_List_Dictionary_Unique_Similarity - Fatal编程技术网

Python 如何根据DICT中某个值的百分比相似性来唯一化DICT列表

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

我有一个目录列表,它的属性可能与列表中的其他目录重复或类似。我想使用相似性比较函数来统一这个列表。如果任何一个DICT的键“问候语”的值彼此相差一定百分比,则只应保留一个

例如,在此列表中,我只想保留一个“hello world”:

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'}, {}, {}]