Python 迭代项目列表并将其分组到具有相似性分数的词典中的最快方法是什么

Python 迭代项目列表并将其分组到具有相似性分数的词典中的最快方法是什么,python,list,comparison,Python,List,Comparison,我有一张图片列表。将列表中的图像与相似性(imga,imgb)分数进行比较并将其分组到字典中的最快方法是什么?返回的相似性阈值后的第一项作为关键字 示例: for i in ImgList: for j in ImgList: #compare code here ImgList.remove(j) def get_sim(img1,img2): (score, diff) = measure.compare_ssim(img1, im

我有一张图片列表。将列表中的图像与
相似性(imga,imgb)
分数进行比较并将其分组到字典中的最快方法是什么?返回的相似性阈值后的第一项作为关键字

示例

for i in ImgList:
     for j in ImgList:
          #compare code here
          ImgList.remove(j)
def get_sim(img1,img2):
    (score, diff) = measure.compare_ssim(img1, img2, full=True)
    return score

img1 = cv2.imread("1.png")
img2 = cv2.imread("2.png") 
img3 = cv2.imread("3.png")
img4 = cv2.imread("4.png") 
img5 = cv2.imread("5.png")
img6 = cv2.imread("6.png") 

imgs = [img1,img2,img3,img4,img5,img6]

for i in imgs:
    for j in imgs:
        similarity = get_sim(i,j) # values in range 0 to 1
            if(similarity>=0.5):
                imgs.remove(j)
                #Need to group i,j
ImgList=[img1、img2、img3、img4、img5、img6]

如果img1、img3的相似性得分为0.7(>0.5)

如果img2、im4、img6的相似性为0.6(>0.5)

Output={img1:[img3],img2:[img4,img6],img5:[]}

我的方法(索引错误)

for i in ImgList:
     for j in ImgList:
          #compare code here
          ImgList.remove(j)
def get_sim(img1,img2):
    (score, diff) = measure.compare_ssim(img1, img2, full=True)
    return score

img1 = cv2.imread("1.png")
img2 = cv2.imread("2.png") 
img3 = cv2.imread("3.png")
img4 = cv2.imread("4.png") 
img5 = cv2.imread("5.png")
img6 = cv2.imread("6.png") 

imgs = [img1,img2,img3,img4,img5,img6]

for i in imgs:
    for j in imgs:
        similarity = get_sim(i,j) # values in range 0 to 1
            if(similarity>=0.5):
                imgs.remove(j)
                #Need to group i,j
编辑

for i in ImgList:
     for j in ImgList:
          #compare code here
          ImgList.remove(j)
def get_sim(img1,img2):
    (score, diff) = measure.compare_ssim(img1, img2, full=True)
    return score

img1 = cv2.imread("1.png")
img2 = cv2.imread("2.png") 
img3 = cv2.imread("3.png")
img4 = cv2.imread("4.png") 
img5 = cv2.imread("5.png")
img6 = cv2.imread("6.png") 

imgs = [img1,img2,img3,img4,img5,img6]

for i in imgs:
    for j in imgs:
        similarity = get_sim(i,j) # values in range 0 to 1
            if(similarity>=0.5):
                imgs.remove(j)
                #Need to group i,j

我以前的回答可能不符合你的要求,这可能有效:

res = {}
for i in range(len(ImgList)):
    for j in ImgList[i:]:
        res.setdefault(get_sim(ImgList[i],j), []).append(j)
res = {i.pop(0):i for i in res.values()}
你可以用列表理解的方式来写

res = {}
_ = [res.setdefault(get_sim(ImgList[i],j), []).append(j) for i in range(len(ImgList)) for j in ImgList[i:]]
res = {i.pop(0):i for i in res.values()}

我以前的回答可能不符合你的要求,这可能有效:

res = {}
for i in range(len(ImgList)):
    for j in ImgList[i:]:
        res.setdefault(get_sim(ImgList[i],j), []).append(j)
res = {i.pop(0):i for i in res.values()}
你可以用列表理解的方式来写

res = {}
_ = [res.setdefault(get_sim(ImgList[i],j), []).append(j) for i in range(len(ImgList)) for j in ImgList[i:]]
res = {i.pop(0):i for i in res.values()}

没有任何额外的细节

创建一个函数,该函数使用
相似性
函数创建高于阈值的列表,然后在字典中使用该函数。像这样:

def find_imgs_above_threshold(img, img_list, threshold=0.5):
    img_list_without_img = img_list.remove(img)
    sim_scores = [similarity(img, i) for i in img_list_without_img]
    imgs_above_threshold= [score for score in sim_scores if score >= threshold]
    return imgs_above_threshold

img_dict = {i: find_imgs_above_threshold(i, imgList) for i in imgList}

没有任何额外的细节

创建一个函数,该函数使用
相似性
函数创建高于阈值的列表,然后在字典中使用该函数。像这样:

def find_imgs_above_threshold(img, img_list, threshold=0.5):
    img_list_without_img = img_list.remove(img)
    sim_scores = [similarity(img, i) for i in img_list_without_img]
    imgs_above_threshold= [score for score in sim_scores if score >= threshold]
    return imgs_above_threshold

img_dict = {i: find_imgs_above_threshold(i, imgList) for i in imgList}

到目前为止,您在相似度评分方面做了哪些尝试,您能举例说明您使用什么数据结构来保存相似度评分吗?@DeveshKumarSingh这是一个函数,它接收两幅图像并根据它们的直方图相似度返回评分。是的,你能给我们展示一下你的图像列表中该函数的示例输出吗?@DeveshKumarSingh在运行代码时添加了额外的代码而不是代码,示例输出!我不能运行代码并猜测相似性,你能运行你拥有的代码,制作一个6x6 2D矩阵并将其添加到问题中吗?到目前为止,你在相似性评分方面做了哪些尝试,你能举例说明你用什么样的数据结构来保存相似性分数吗?@DeveshKumarSingh这是一个函数,它接收两幅图像并根据它们的直方图相似性返回分数。是的,你能给我们展示一下你的图像列表中该函数的示例输出吗?@DeveshKumarSingh在运行代码时添加了额外的代码而不是代码,示例输出!我不能运行代码并猜测相似性,你能运行你拥有的代码,制作一个6x62D矩阵并将其添加到问题中吗?