【问题标题】:Get combinations of elements in different folders but not combine the elements in the same folder, python获取不同文件夹中元素的组合但不组合同一文件夹中的元素,python
【发布时间】:2017-03-27 11:02:55
【问题描述】:

我是 Python 的初学者,在我问这个问题之前,我努力在这里找到答案。我有不同的设计,有几张照片,我想比较它们的汉明距离。但我不想比较位于同一文件夹中的相同设计文件的图像。我基于一个名为 Imagehash 的库进行比较。在比较了不同的图像组合之后,我想保留那些具有最高汉明距离得分的图像。让我用一个简单的例子来解释我想要什么:

文件夹table里有三张图片:table_1.jpg、table_2.jpg、table_3.jpg 文件夹中的椅子两张图片:chair_1.jpg、chair_2.jpg

我想要获得的是文件的文件路径(我可以这样做),以便稍后使用 Image.open() 和 imagehash.phash 函数。组合应如下所示:

(table_1.jpg, chair_1.jpg), (table_1.jpg, chair_2.jpg), (table_2.jpg, chair_1.jpg ), (table_2.jpg, chair_2.jpg), (table_3.jpg, chair_1.jpg), (table_3.jpg, chair_2.jpg)

那我必须在“_”之后拆分,并且使用 groupby 和 itemgetter,我猜

【问题讨论】:

    标签: python operating-system combinations hamming-distance phash


    【解决方案1】:

    你需要itertools.product 来计算你想要的元组:

    from itertools import product
    
    table = ['table_1.jpg', 'table_2.jpg', 'table_3.jpg']
    chair = ['chair_1.jpg', 'chair_2.jpg']
    
    print(list(product(table, chair)))
    # [('table_1.jpg', 'chair_1.jpg'), ('table_1.jpg', 'chair_2.jpg'), ('table_2.jpg', 'chair_1.jpg'), ('table_2.jpg', 'chair_2.jpg'), ('table_3.jpg', 'chair_1.jpg'), ('table_3.jpg', 'chair_2.jpg')]
    

    如果文件名都在同一个列表中,您可以使用combinations 并检查元素的开头是否相同:

    from itertools import combinations
    filenames = ['table_1.jpg', 'table_2.jpg', 'table_3.jpg', 'chair_1.jpg', 'chair_2.jpg']
    
    print [(x,y) for x,y in combinations(filenames, 2) if x.split('_')[0] != y.split('_')[0]]
    # [('table_1.jpg', 'chair_1.jpg'), ('table_1.jpg', 'chair_2.jpg'), ('table_2.jpg', 'chair_1.jpg'), ('table_2.jpg', 'chair_2.jpg'), ('table_3.jpg', 'chair_1.jpg'), ('table_3.jpg', 'chair_2.jpg')]
    

    【讨论】:

    • 是的,但我的问题是如何防止将同一文件夹中的文件组合起来
    • product 不会混合来自同一个列表的元素。
    • 再问一个问题:combined = ((x, y, (64 - (x - y))/64) for x, y in combination(df['hash_1'], 2) if x != y) series = Series(list(g) for k, g in groupby(combined, key=itemgetter(0))) 实际上我先计算 phash 然后在函数中使用它而不是文件名,我如何组合图像名称用散列分割
    • @KenanDalay:这看起来像是一个单独的问题。代码不方便注释
    • 我会问我是否没有得到-3 :) 但无论如何都非常感谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多