簡體   English   中英

將目錄中的文件相互比較,無需重復比較

[英]Comparing files in directory to each other with no repeated comparisons

我想要做的是創建一個文件列表以在 N 個文件的目錄中進行比較。 最終目標是比較圖像以找到重復的圖像,而不管格式如何。 給定文件 1.jpg 2.jpg 3.jpg。

使用這個

import sys,os,time

def main(argv):
    list1 = os.listdir(argv[0])
    list2 = os.listdir(argv[0])

file_compare_list = []

for pic1 in list1:
    for pic2 in list2:
        file_compare_list.append([pic1,pic2])

print file_compare_list


if __name__ == "__main__":
    main(sys.argv[1:])

我得到一個這樣的列表

[['1.jpg', '1.jpg'], #0
['1.jpg', '2.jpg'],  #1
['1.jpg', '3.jpg'],  #2
['2.jpg', '1.jpg'],  #3
['2.jpg', '2.jpg'],  #4
['2.jpg', '3.jpg'],  #5
['3.jpg', '1.jpg'],  #6
['3.jpg', '2.jpg'],  #7
['3.jpg', '3.jpg']]  #8

現在我可以通過文件 go 並確保每個文件都會進行比較,但有明顯的重復。 索引 0、4 和 8 很容易處理,我可以通過文件名比較它們並刪除它們。 我更關心的是索引 2 和 6 之類的東西,如果我做了什么,那將是重復的。 對此的任何幫助將不勝感激。

你需要itertools.combinations 此代碼准確打印您需要的內容:

import os, itertools

files = os.listdir("/path/to/files")
for file1, file2 in itertools.combinations(files, 2):
  print file1, file2

以及它背后的一些理論: http://en.wikipedia.org/wiki/Combination

總是有itertools.combinations

import itertools

my_list=['1.jpg','2.jpg','3.jpg']
my_combinations = [x for x in itertools.combinations(my_list,2)]

my_combinations 將是:

[('1.jpg', '2.jpg'), ('1.jpg', '3.jpg'), ('2.jpg', '3.jpg')]

這是怎么個提示?

而不是計算比較矩陣P x P的所有非對角元素:

P = {A, B, C, D, ...}

  + A + B + C + D + ...
A |   | * | * | * | ...
B | * |   | * | * | ...
C | * | * |   | * | ...
D | * | * | * |   | ...
  |   |   |   |   |

您可以計算上三角形:

  + A + B + C + D + ...
A |   | * | * | * | ...
B |   |   | * | * | ...
C |   |   |   | * | ...
D |   |   |   |   | ...
  |   |   |   |   |

或下三角形:

  + A + B + C + D + ...
A |   |   |   |   | ...
B | * |   |   |   | ...
C | * | * |   |   | ...
D | * | * | * |   | ...
  |   |   |   |   |

(來自我的這個答案


抱歉,如果這太遲鈍了。 一些實際代碼:

>>> list = ['a', 'b', 'c', 'd', 'e']
>>> pairs = [[x,y] for i, x in enumerate(list) for y in list[i+1:]]
>>> print pairs
[['a', 'b'], ['a', 'c'], ['a', 'd'], ['a', 'e'], ['b', 'c'], ['b', 'd'], ['b', 'e'], ['c', 'd'], ['c', 'e'], ['d', 'e']]

查看它的作用並適應您的問題:

[(x, y) for x in a for y in a if x < y]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM