比较目录中的文件,避免重复比较

0 投票
4 回答
1251 浏览
提问于 2025-04-16 21:41

我想做的是创建一个文件列表,用来比较一个目录里的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

现在我可以逐个查看这些文件,确保每个文件都会被比较,但有些明显的重复文件。比如索引0、4和8的文件名很容易处理,我可以通过文件名来比较并去掉它们。让我更担心的是像索引2和6这样的文件,如果我处理了它们,可能会出现重复的情况。

任何帮助都会非常感激。

4 个回答

3

这个提示怎么样?

与其计算比较矩阵 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']]
4

总是可以使用 itertools.combinations 这个工具:

import itertools

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

我的组合结果将会是:

[('1.jpg', '2.jpg'), ('1.jpg', '3.jpg'), ('2.jpg', '3.jpg')]
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

撰写回答