Python:从第0个元素(元组中)中具有重复数据的元组列表中查找元组

wol*_*pha 2 python list python-2.7

我有一个包含文件名文件路径的元组列表.我想找到重复的文件名(但文件路径可能会有所不同),即元组,其文件名是相同的,但文件路径可能会有所不同.

元组列表的示例:

file_info = [('foo1.txt','/home/fold1'), ('foo2.txt','/home/fold2'), ('foo1.txt','/home/fold3')]
Run Code Online (Sandbox Code Playgroud)

我想找到重复的文件名,即file_info [2](在上面的例子中)打印并删除它.我可能会迭代检查:

count = 0
for (filename,filepath) in file_info:
    count = count + 1
    for (filename1,filepath1) in file_info[count:]:
        if filename == filename1:
            print filename1,filepath1
            file_info.remove((filename1,filepath1))
Run Code Online (Sandbox Code Playgroud)

但是,是否有更高效/更短/更正确/ pythonic的方式来完成相同的任务.谢谢.

Mar*_*ers 5

使用set可以避免创建双循环; 添加您尚未看到的项目列表中,以避免更改正在循环的列表(这将导致跳过的项目):

seen = set()
keep = []
for filename, filepath in file_info:
    if filename in seen:
        print filename, filepath
    else:
        seen.add(filename)
        keep.append((filename, filepath))
file_info = keep
Run Code Online (Sandbox Code Playgroud)

如果顺序并不重要,你不打印你删除的项目,那么另一种方法是使用字典:

file_info = dict(reversed(file_info)).items()
Run Code Online (Sandbox Code Playgroud)

反转输入列表可确保第一个输入列表保留条目而不是最后条目.

如果您需要具有重复项的文件的所有完整路径,我将构建一个以列表作为值的字典,然后删除只有一个元素的任何内容:

filename_to_paths = {}
for filename, filepath in file_info:
    filename_to_paths.setdefault(filename, []).append(filepath)
duplicates = {filename: paths for filename, paths in filename_to_paths.iteritems() if len(paths) > 1}
Run Code Online (Sandbox Code Playgroud)

duplicates字典现在只包含在其中拥有1条多路径文件名file_info列表.